{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Missing Value Support\n",
    "\n",
    "author: Jacob Schreiber <br>\n",
    "contact: jmschreiber91@gmail.com"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The majority of machine learning algorithms assume that they are operating on a fully observed data set. In contast, a great deal of data sets in the real world are missing some values. Sometimes, this missingness is missing at random (MAR), which means that there is no important pattern to the missingness, and sometimes the missingness itself can be interpreted as a feature. For example, in the Titanic data set, males were more likely to have missing records than females were, and those without children were more likely to have missing records. \n",
    "\n",
    "A common approach to bridging this gap is to impute the missing values and then treat the entire data set as observed. For continuous features this is commonly done by replacing the missing values with the mean or median of the column. For categorical variables it is commonly done by replacing the missing values with the most common category observed in that column. While these techniques are simple and allow for almost any ML algorithm to be run, they are frequently suboptimal. Consider the follow simple example of continuous data that is bimodally distributed:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fri Jan 10 2020 \n",
      "\n",
      "numpy 1.18.1\n",
      "scipy 1.4.1\n",
      "pomegranate 0.12.0\n",
      "\n",
      "compiler   : Clang 10.0.0 (clang-1000.11.45.5)\n",
      "system     : Darwin\n",
      "release    : 17.7.0\n",
      "machine    : x86_64\n",
      "processor  : i386\n",
      "CPU cores  : 4\n",
      "interpreter: 64bit\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import time\n",
    "import pandas\n",
    "import random\n",
    "import numpy\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn; seaborn.set_style('whitegrid')\n",
    "import itertools\n",
    "\n",
    "from pomegranate import *\n",
    "\n",
    "random.seed(0)\n",
    "numpy.random.seed(0)\n",
    "numpy.set_printoptions(suppress=True)\n",
    "\n",
    "%load_ext watermark\n",
    "%watermark -m -n -p numpy,scipy,pomegranate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/ksachdeva/Desktop/Dev/myoss/pomegranate/env/lib/python3.7/site-packages/IPython/core/magics/pylab.py:160: UserWarning: pylab import has clobbered these variables: ['random']\n",
      "`%matplotlib` prevents importing * from pylab and numpy\n",
      "  \"\\n`%matplotlib` prevents importing * from pylab and numpy\"\n"
     ]
    }
   ],
   "source": [
    "%pylab inline\n",
    "from pomegranate import *\n",
    "import seaborn\n",
    "seaborn.set_style('whitegrid')\n",
    "numpy.random.seed(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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qamp5scpKSn4+vre8TgeHh60b9/eJjFaQ0JCQpWOr7xqUn0cXhdPTwCrxGCtuvwaktViqsgdy25VgTudDRgwgCVLlpCbm0v9+vUBOHz4MEFBQdy6dQtXV1dzjHFxcSxbtozk5GTatm3LX/7yF/r06QPA9evXWb58Obt27cLLy4s//elPANSpU4e6desSEBDA2rVr+f3vf8/PP/9MdHQ0X375Jbdu3eLuu+8mKiqK+++/n+TkZIKDg3njjTdYunQpV65coWfPnixZsoRGjRqVWAc3N7dSP8eykoRdk8G1a9c4f/68+YYPULBueExMDP369SMzM5NPPvmEuXPn2jMsEbGDhx4qe3tenjsWdApY7A532SxRu3btaNGiBUePHiU0NBSAQ4cOERISwu7du837nT59msjISP72t78RGBjI559/zrRp09i6dSvt27fnrbfe4tNPP+Wtt97C1dWVGTNmlPqa06dPx9PTky1btpCfn8/SpUv529/+xt69e837vP322yxduhSAyZMns2bNGiIjI8tfwTLYdcwgKSmJJk2aFLnd25gxY/Dz82P48OGMHDmSkSNH0qNHD3uGJSJi1r9/f/O4gcFg4NixYwQHBxfZZ82aNfzhD39gxIgR+Pv7M2bMGEJDQ9mwYQP5+fl8/PHHTJs2jfvvv5/u3buXmQz69evH7NmzadeuHXfffTePP/44iYmJRbrQp02bRteuXenatStDhw7lu+++s3q97doy6NKlCwcPHiwagKsrUVFR9gxDRBzgTr/Ub93KcXg3ERT0VkyZMoXc3Fy++uor7r77bho3blxkn8TERH744QdiYmLMZQaDgS5dupCWlkZaWhr33XefeVunTp1Kfb0xY8awd+9e/vWvf/HTTz/x/fffAwX3WTbx9/c3/12vXj1yc3MrXc/b6eY2IiKFBAYG4uLiwjfffMOhQ4cYMGBAsX2MRiOTJk0qdkMad3d389+Ff9m7upb8VZuXl8fEiRO5du0agwcPpn///hgMBqZNm1Zkv8K9Kbcf21qUDERECnF2duahhx7i8OHDHDlyhI0bNxbbp02bNly4cIFWrVqZy9544w18fHwYN24cjRs35rvvvqNjx45A6QO3P/74I19//TWfffYZTZs2BWDTpk2Abb7wy6K1iUREbhMcHMy2bdvw8fExT4MvbMKECcTGxrJu3TqSkpLYvHkz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v/yShIQE/vrXv/LWW2/RpEkTR4dWIT4+PrRt2xZ3d3fatm2Lh4cHV69epXHjxo4OrdzWrVtH7969eeGFF7h8+TLjx49n9+7d1aJnQGMGNvLjjz/y7LPP8tprr9G3b19Hh1MhgYGBHD16FChYGPDee+91cEQV98svvzBx4kQiIyMZOXKko8OplE2bNrFx40Y2bNhA+/btWbJkSbVNBAC//e1v+eyzz8jPzyclJYVbt25V24tOGzRoQP369QHw9vYmNzcXo9Ho4Kgso4vObGTy5MmcOXOGFi1aAAW/st966y0HR1U+eXl5vPzyy/zwww/k5+ezcOFC2rVr5+iwKiQ6Opp9+/bRtm1bc9m7775b7Qdgx40bx8svv1xtPxeTV155hePHj5Ofn89f/vIX81hVdZORkcHMmTNJTU3FYDDwxz/+sdq0QpUMRERE3UQiIqJkICIiKBmIiAhKBiIigpKBiIigZCBiNnbs2FKvTP7000/p1KkTaWlppT4/NzeXgIAAjh8/bqsQRWxGyUDkV0OHDiU+Pp7s7Oxi2/bu3Uvv3r1p2LChAyITsT0lA5FfDRo0CIPBwGeffVakPCcnh8OHDzNs2DAHRSZie0oGIr9q2LAhvXv3JjY2tkj50aNHycvLo3///ty8eZOXXnqJXr160alTJwYNGkRcXFyJx+vTpw/bt283P/7iiy8ICAgwP7506RIRERF069aNfv36sWzZMgwGg20qJ3IHSgYihQwZMoRPP/2UnJwcc9m+ffsYOHAgderUITo6mqSkJNauXcuePXvo3r07UVFRRfa3RF5eHlOmTKFx48bExMTwyiuvcPDgwWq1/r3ULEoGIoUEBwdjNBr54osvAMjOzubw4cPm9WWCgoKYO3cu9913H61bt2bixImkp6fzv//9r1yv8/nnn5OSksL8+fNp164d999/P7Nnz2bjxo3k5eVZvV4id1J91yMWsYG6desSHBzM/v37eeihh4iPj8fLy4uePXsCEBYWxoEDB9iyZQtnz57lP//5D0C5V6ZMTEwkPT2d3/72t+ay/Px8srKyuHz5snmBQxF7UTIQuc3QoUOZPn06ubm57N27l8GDB5vvjPbCCy9w8uRJhg8fztixY2nUqBFjx44t8Ti335wlNzfX/LfRaKRt27a8+eabxZ5XnZejlupLyUDkNg888ADOzs58+eWXxMfHs2HDBgCuXbvG3r172bZtG126dAHg0KFDQMGv+tu5ubkVuTnQhQsXzH+3adOGS5cu0ahRI/P69//v//0/PvzwQ1555RWb1U2kNBozELmNq6srjzzyCK+99hrNmjWjU6dOANSpU4e6dety4MABkpOTOXr0KAsWLAAocQC5c+fOxMTE8N///pfjx4+zfv1687Y+ffrg6+vLiy++yOnTp/nXv/7FrFmzcHFxMd87W8SelAxESjB06FASEhKK3JjEw8ODV155hdjYWEJDQ1myZAlTp07lrrvuIiEhodgxnn/+eby8vHj00UdZsGABzz77rHmbq6srb7/9Nvn5+YwePZopU6bQs2dP5s+fb5f6idxON7cRERG1DERERMlARERQMhAREZQMREQEJQMREUHJQEREUDIQERGUDEREBPj/cw+TUFPCXp8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = numpy.concatenate([numpy.random.normal(0, 1, size=(1000)), numpy.random.normal(6, 1, size=(1250))])\n",
    "\n",
    "plt.title(\"Bimodal Distribution\", fontsize=14)\n",
    "plt.hist(X, bins=numpy.arange(-3, 9, 0.1), alpha=0.6)\n",
    "plt.ylabel(\"Count\", fontsize=14)\n",
    "plt.yticks(fontsize=12)\n",
    "plt.xlabel(\"Value\", fontsize=14)\n",
    "plt.yticks(fontsize=12)\n",
    "plt.vlines(numpy.mean(X), 0, 80, color='r', label=\"Mean\")\n",
    "plt.vlines(numpy.median(X), 0, 80, color='b', label=\"Median\")\n",
    "plt.legend(fontsize=14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The data peaks around 0 and around 6. Replacing the missing values with ~3 will be inserting values into the data set that mostly don't exist in the observed values. The median is slightly better, but will still cause the imputed values to be in one of the two clusters. This has the effect of essentially increasing the variance of the appropriate distribution. Let's take a look at what the distribution looks like if we add 500 missing values and then impute them using the mean of the observed values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = numpy.concatenate([X, [numpy.nan]*500])\n",
    "X_imp = X.copy()\n",
    "X_imp[numpy.isnan(X_imp)] = numpy.mean(X_imp[~numpy.isnan(X_imp)])\n",
    "\n",
    "plt.title(\"Bimodal Distribution\", fontsize=14)\n",
    "plt.hist(X_imp, bins=numpy.arange(-3, 9, 0.1), alpha=0.6)\n",
    "plt.ylabel(\"Count\", fontsize=14)\n",
    "plt.yticks(fontsize=12)\n",
    "plt.xlabel(\"Value\", fontsize=14)\n",
    "plt.yticks(fontsize=12)\n",
    "plt.vlines(numpy.mean(X), 0, 80, color='r', label=\"Mean\")\n",
    "plt.vlines(numpy.median(X), 0, 80, color='b', label=\"Median\")\n",
    "plt.legend(fontsize=14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It doesn't appear to be that great. We can see the issue with increased variance by trying to fit a Gaussian mixture model to the data with the imputed values, versus fitting it to the data and ignoring missing values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtwAAADkCAYAAACrH/OAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeVxU9frA8Q/DpoCAOwgoLoSWuFLqdRdXEFFyLb2ael1K7VaWa5qmqbmVaFdzqSzUNBHQTAW3ItOuXa9L4hImggq5gAoIDMP8/uDHXEYGGJRZgOf9evli5nzP8szh+OWZc76LhVqtViOEEEIIIYQwCIWpAxBCCCGEEKIik4RbCCGEEEIIA5KEWwghhBBCCAOShFsIIYQQQggDkoRbCCGEEEIIA5KEWwghhBBCCAOShLsC8/b2xtvbm4SEhEJl27dvx9vbm9WrV5sgsrzYTpw4YfTjZmdns2PHjqfevjTnNCQkhBEjRjz1sQDCwsLo0qXLM+1Dl127dtG8eXMePXpUqEylUtGxY0e2bt1a4n6mT5/OzJkzyzw+IUTZGDVqlMnq+dKaOXMm3t7efPrpp4XK0tLSaN68uaY+TExMxNvbm/j4+Gc6piH+FqWnp9OyZUu2bdums3zZsmUMGjSoxP2cOHECb2/vMo1NmI4k3BWctbU1R44cKbQ8OjoaCwsLE0RkWt9//z2fffbZM+1D33M6duxY/vWvfz3Tsfz9/QkPD3+mfejSp08fLCwsOHz4cKGyX3/9lZSUFAICAsr8uEIIURxra2uOHj1aaPnx48fJycnRvHd1dSUmJgZ3d/dnOl5MTAy+vr7PtI8n2dvb06NHDw4ePKiz/ODBgwwYMKBMjynMnyTcFZyvr2+h5DAtLY0zZ87w/PPPmygq0ymLeZ70Paf29vY4Ozs/07GqVKlCjRo1nmkfujg6OtK1a1cOHTpUqOyHH37gb3/7GzVr1izz4wohRHHatGnD5cuXuX37ttby6OhoWrVqpXlvaWlJ7dq1sbS0fKbj1a5dGxsbm2fahy79+/fn3//+N/fv39da/t///pfbt2/j7+9f5scU5k0S7grOz8+P3377TavpwPHjx/H19cXe3l5r3ejoaAICAmjZsiWDBg3ixx9/1JSlpaUxZ84cOnToQPPmzenTp4/Wt3dvb2/Cw8MJDAzEx8eH4cOHc+PGDb1inDlzJkuXLuWtt96iZcuWBAQEcOnSJVavXo2vr69WYpj/GDEyMpIuXbrg6+vLwoULUSqVgO4mGPmPVE+dOsWsWbNITk7G29ubxMRE1Go1n332GZ07d6Zt27aMGzeO69evl8k5LdikRKlUMn/+fDp06EDLli157bXXuHbtWollBT/PqVOn6NKlC99++y1dunShVatWvPPOO2RmZmqOGRkZSc+ePWnZsiXvvPMOb7/9NiEhITo/R2BgIDExMaSnp2uWqVQqDh06RGBgoGbZrl276Nu3L82bN6ddu3YsWLAAlUpVaH+rV69m1KhRWsu6dOlCWFgYALm5uaxdu5ZOnTrRtm1b/vGPf2hdI/v376dfv374+PjQp08f9uzZU9yvQQjxFGJiYggMDKRFixaMHz+eDz/8UNMsLCQkhLfeeouFCxfStm1b2rdvz4YNGzTb5ubmsmnTJnr27EmLFi0YOXIkly5d0pR7e3vzySef0L59e8aMGQPA6dOnGTx4MC1atCAgIKDEJ3Z16tShefPmWjc1srOziYmJoUePHpplTzYpOXDgAP7+/vj4+NC7d292796tWbe4soJNSnr06ME333zD8OHD8fHxYcCAAZw7d06zbkJCAmPGjKFly5YEBgayefNmrZgK6tKlC9WqVSv0FHH//v20a9eOunXrAvDHH38wbtw4WrdujY+PD6+88gpxcXGF9hcfH6/5u5XvyTr3119/JTg4mBYtWtC/f38iIyM1ZTdv3tQcp127dsyePZuMjAydsQvDkIS7gmvcuDFubm5ayfPhw4fp2bOn1nqXLl3i3Xff5R//+Ad79+5l6NChTJkyhdjYWACWLFlCXFwcW7ZsYd++fbz44ou8//77ZGdna/axdu1aZs+eze7du3nw4AGrVq3SO85vvvmGtm3bEhERQbVq1Rg1ahQpKSl8++23dOzYkffff1/r7vS6detYtWoV69atIzo6mk8++aTEY7Ru3ZrZs2dTu3ZtYmJicHV15ZtvviEiIoKPP/6YnTt30qBBA0aPHs3jx4+f+ZwWFBoays8//8yGDRuIjIzE3t6eWbNmlVj2pHv37rF//342btxISEgI0dHRmoT29OnTzJ49m7FjxxIWFkbVqlXZv39/kTF169YNa2trjh8/rll28uRJsrKy6NWrF5CX5C9evJjp06dz4MAB5s+fz65du3Q2RSnJ1q1b2bdvHytWrGDnzp3Uq1ePMWPGkJWVxV9//cW7777LuHHjOHDgAOPHj2f27NklfvkRQugvISGByZMn06dPH8LDw/Hx8SE0NFRrnaioKCwtLQkLC2P8+PGsWrWKP/74A8ird7ds2cKsWbPYs2cP7u7ujB8/nrS0NM32hw8fZtu2bcyZM4c7d+4wYcIEAgMD2bt3L2+88QaLFi3S2SSvID8/P611Tp06RePGjalVq5bO9e/du8f06dMZM2YMBw4cYOLEicydO5e4uLhiy3RZu3Yt48ePJzIyEkdHRz788EMAcnJymDhxIvb29uzevZsJEyawdu3aIj+DtbV1oRtTarVaqzlJbm4ukyZNon79+kRERLB9+3ays7NZvnx5sedHl+TkZCZOnEhwcDD79u1j0qRJLFiwQFO/L1iwAFtbW/bs2cOmTZs4ffo0n3/+eamPI56eJNyVQI8ePTSVl1KpJCYmBj8/P611Nm/ezMsvv8zAgQOpX78+I0aMICAggK+//hqAtm3bsmDBApo1a4anpydjx47lwYMHJCcna/YxevRoOnTowHPPPceIESM4f/683jE2bdqUkSNH4unpSUBAAI8fP2bOnDk0btyYkSNHkpqaSkpKimb96dOn4+vrS7t27XjzzTf57rvvyM3NLfYYNjY2VKtWDYVCoXkUuWnTJqZPn06HDh1o3Lgx77//PlZWVkW2vSvNOS0oMTGRKlWq4O7uToMGDfjggw949913Syx7Uk5ODrNnz8bb25vOnTvTuXNnzXnevn07ffr04ZVXXqFx48Z88MEHuLi4FBmTra0tvXv35sCBA5pl+/fvp0ePHtjZ2QFQtWpVFi9eTM+ePXF3d8ff3x9vb2+uXr1a7PnRZdOmTbz33nu0b9+exo0bM3/+fNRqNVFRUSQlJZGTk4OLiwtubm4MGTKELVu2GKQ5jRCV1a5du3jhhReYMmUKjRo14s0336Rly5Za61SrVo2ZM2fSoEEDxo8fj7OzMxcuXECtVvPNN98wZcoU/Pz8aNy4MR9++CFWVlZERERoth82bBiNGjXCy8uL0NBQ2rVrx+jRo2nQoAH+/v6MGTOGr776qtg4/fz8+PXXXzVP36KjozU3AXRJTk5GqVRSt25d3NzcePnll9myZQu1atUqtkyXgQMH0rNnTxo2bMhrr73GhQsXgLybEbdu3WLJkiU0adKEwMBARo4cWeznCAwM5OTJkzx8+BCA3377jZSUFHr37g1ARkYGw4YN47333qN+/fo0b96cQYMGab7glMY333xDp06dGDlyJPXr16d///6MGjVK0/n95s2bODk5Ua9ePXx8fFi3bp3Wk0xheFamDkAYnp+fH6+//jo5OTmcPHmSJk2aFGqfGxcXx5UrV7QetSmVSlq0aAHkVULR0dHs2rWLa9eu8fvvvwNoJbn169fXvHZwcNDq4FISDw8PzesqVapQq1YtbG1tATQ/C95Nb926teZ18+bNSU1N5e7du3ofD/J6kiclJTF9+nQUiv9998zKytKrWUlJ57Sg4cOH88MPP9C5c2fatGmDn58fL7/8colluhR1ni9fvszgwYM1ZVZWVjRv3rzYzxEYGMgbb7xBZmYmlpaWREdH8/HHH2vKW7RoQdWqVfn000+Ji4vj8uXLxMfH061bt2L3+6SHDx9y584d3nrrLa1znZmZyfXr1/H396dbt26MGzeOBg0a0L17d4KDg3F0dCzVcYQQRbt8+XKhOqFVq1Y8ePBA897NzU2rXbS9vT1KpZJ79+6RmpqqlaBbW1vTvHlzrbvFbm5umtfXrl3jp59+0qqvc3JySvwi7eXlhYuLCzExMfTu3ZsjR44QGhrK6dOnda7frFkzevTowYQJE6hfv76m/nBycsLR0bHIMl0K/i1ycHAgNzcXlUrF5cuXqV+/vlad1KpVK77//vsiP4evry+1atXiyJEjDBw4kAMHDtC9e3ccHBw0+x8xYgRhYWFcuHCBP//8k99//53atWsXe350iYuL48cffyx0rvP3NWHCBObMmcOhQ4fo2LEjffr0kXbkRiYJdyXQpk0bLC0t+e233zh8+LDOOwUqlYpx48YRHBystTy/M8l7773Hf/7zH4KCghgxYgS1a9dm2LBhWutaW1trvS9NB8UnO74UTMpKWj8/6VcoFDpHXikq8c9vh7xq1SqaNGmiVVatWrVij6/POS2oSZMmHDlyhB9//JFjx46xfv16du7cSVhYWLFluhR1ni0tLQud85J+B+3bt8fe3p4ff/wRW1tbFAoFHTt21JQfP36cKVOmMGjQIDp37syUKVN4//33de5L17nPP8f5v4NPP/2Uhg0baq3j6OiIQqFgw4YNnD9/nqNHj2r+wG7cuJEOHToU+xmEEPrR1cHwyTriyfolX5UqVXQuV6lUWn068m+QQN7/+4CAAF5//XWtbUqq3yHvpsbRo0dxdXXF2dmZ+vXrF5lwW1hY8K9//Yvff/+dI0eOcOTIEbZt28b69evp1KlTsWVP0tWBUq1WP1X9amFhQUBAAAcOHGDAgAEcOHCADz74QFOelpbGyy+/TM2aNenRowcDBgzgypUrOp8AFFe/5r8ODAxk0qRJWuvkn+ugoCA6depEdHQ0P/74IzNnzuTEiRMsXry42M8gyo40KakEFAoF3bp148iRIxw9elRnW+OGDRuSkJBAgwYNNP8iIiKIiooiLS2Nffv2sXLlSt5880169eqluSNSFqN+PI2CHXUuXLhArVq1qFmzJtbW1lqdANVqtVYnk4KVlqOjIzVr1uTOnTuaz+zu7s6qVau4fPlyscfX55wWFB4ernksunjxYsLDwzV3jIsrK40mTZpoHn9CXgWc3wa/uM/h7+/PkSNHiIqKwt/fHyur/30P//bbbxk8eDALFy5kyJAhmutE1+/9yXOflpamaQZUo0YNnJ2dtc61m5sbK1eu5MqVK/zxxx8sW7YMHx8fpk2bRnh4OK1btyY6OrpU50AIUTQvLy+tOgLQPK0siYODA7Vr1+bs2bOaZUqlkt9//73Ql+h8DRs2JD4+XuvvSkxMDN99912Jx/Pz8+P48eNERUWVeEMjLi6OpUuX8sILLzB16lT27NmDr68vUVFRxZaVhpeXFwkJCVqd5fU5d4GBgZw4cYKTJ0+iVCrp2rWrpuzkyZPcvXuXrVu3Mn78eDp06MCtW7eKrF8BrTq24HwQus718ePHNTduVq5cyZ07dxg2bBjr1q1jwYIFxfbxEWVPEu5Kws/Pj127duHs7Kz1yCxffoeSL7/8kvj4eLZv38769etp0KABNjY2VK1alUOHDpGYmEhMTAwLFy4EtJt5GNNHH33E+fPn+eWXX1izZg2vvPIKFhYWNG/enLS0NL766isSEhL4+OOPtR6X2tnZ8ejRI/78809ycnIYM2YMn376KdHR0cTHx7NgwQJOnDhBo0aNSoyhpHNa0KNHj1i8eDExMTEkJiaye/du7Ozs8PT0LLasNEaOHMnBgwfZuXMnf/75J0uWLOHmzZsljrceGBjITz/9xLFjxwq16XN2dubMmTNcvnyZK1euMGPGDO7du6fz9+7j48OlS5c4ePAgf/75J/PmzdNK3seMGcMnn3zC4cOHiY+PZ/78+Zw6dYpGjRpRrVo1tm3bxmeffUZCQgK//PILV65c4YUXXijVORBCFG3o0KFcuHCB9evX8+eff7JhwwZOnz6t95wMY8eOZe3atRw+fJi4uDjmzZtHVlYW/fv317n+K6+8wsWLF1m5ciXXr1/nwIEDLF++XDNCR3HatGlDbm4uoaGhJSbcjo6O7Nixg5CQEBISEjh58qSm+UxxZaXRoUMH6tWrx5w5c4iLi+PgwYN6TQ7WtGlT6tevz8cff0yfPn20niA4OzuTkZFBdHQ0iYmJfPvtt5qOk0+qW7cuderUYcuWLSQkJBAWFsZPP/2kKX/11Vc5d+4cq1ev5vr16+zfv5+VK1fi6uoK5I2GsnDhQmJjY7l27RqHDh0q9TkQz0aalFQSHTt2RKVSFXkntlWrVqxYsYK1a9eyYsUK3Nzc+OijjzTfxpcvX86yZcsIDQ3F3d2dSZMmERISwsWLF3nuueeM+VEACAgIYNKkSahUKoYPH87kyZMB8PT0ZMaMGWzYsIFPP/2U4OBgrXZq7du3p1GjRgwYMIBt27Yxbtw4Hj9+zIIFC3j48CHNmjVj8+bNev1BKOmcFvTqq6+SnJzMrFmzSE1NxcvLiw0bNuDk5FRsWWm0bt2a+fPns27dOlJSUujTpw9t2rQp8hFxPh8fH01bxYLj3AK8+eabzJw5k2HDhuHg4EC3bt0YPny4zjvnnTp14u9//ztz5szBysqK1157jTt37mjK//GPf5CZmcn8+fN59OgRzz//PJs2bdK0MVyzZg2rVq1i/fr1ODk5MWrUKL1mYxNC6MfNzY01a9awbNky1q5dS8eOHenZs2eJdUS+MWPGkJaWpvk/3KpVK7Zu3VpkB0Q3Nzc2bNjAihUr+OKLL6hduzZTp07llVdeKfFYlpaWdO/enV9//ZVmzZoVu27t2rUJCQlh5cqVbNy4EScnJ0aMGMHgwYOxsLAosqw0FAoFISEhvP/++wQFBdGoUSNefvllrVGeihIYGMiqVauYO3eu1nJfX1/NaCJZWVk0bdqU+fPnM2fOHK0BCfKP/9FHH7Fo0SL8/f3p0KEDkydP1oyW5eHhwYYNG1i5ciWbN2+mTp06vPXWWwwdOhSADz/8kIULFzJ69GiUSiXt27d/qtFQxNOzUJuqTYAQTyExMRE/Pz8OHTpEgwYNTB2OWTl37hwODg5ad+cDAgJ0ts0XQlQ+V65cIScnR2uCrgkTJuDj48PUqVNNGJn5u3fvHhcvXqRz586aZZs2beL48eOa0byEKI40KRGigjhz5gwTJkzgP//5DwkJCaxfv57bt29r/YEQQlReN27cYMyYMfz888/cvHmTXbt28csvv5TYZEPkmTx5MqGhody8eZMTJ07w1Vdf0bdvX1OHJcoJaVIiRAXx6quvkpiYyNSpU3n06BHNmjVj48aNTzXElBCi4unZsydXr15lzpw53Lt3j4YNG7J69WqaNm1q6tDMXs2aNfnkk0/49NNPWbp0KbVq1WLkyJF6NY8RAqRJiRBCCCGEEAYlTUqEEEIIIYQwIEm4hRBCCCGEMKAK34b7v//9r9bMV+YgKyvL7GLSR3mNG8pv7OU1bii/sZtT3FlZWYWGaqzopM4uW+U19vIaN5Tf2Mtr3GA+sRdXZ1f4hNvW1rbEMTyNLTY21uxi0kd5jRvKb+zlNW4ov7GbU9wlzRRaEUmdXbbKa+zlNW4ov7GX17jBfGIvrs6WJiVCCCGEEEIYkCTcQgghhBBCGJAk3EIIIYQQQhiQJNxCCCGEEEIYkCTcQgghhBBCGJAk3EIYUEpGNokpGaRkZJs6FCGEEKJIVRxryN8rA5KEWwgDSs/KYd3RONKzckwdihBCCFGk7FyF/L0yIEm4hRBCCCGEMCCjT3yjVquZNWsWXl5ejBs3TqssPDycL774QvP+0aNHJCcnc/z4cWrVqkX79u2pW7eupnzcuHEMGDDAaLELIYQQQghRWkZNuOPi4liwYAFnz57Fy8urUPnAgQMZOHAgAEqlkpEjRzJhwgRq1arFtWvXcHJyIiIiwpghCyGEEEII8UyMmnCHhoYSHBxMvXr1Slx348aN1KhRg+HDhwNw5swZFAoFo0aNIjU1lT59+jB58mQsLS0NHbYQQgghhBBPzagJ97x58wA4efJksevdv3+fL774grCwMM0ylUpFx44dee+998jMzGTChAk4ODgwZsyYYveVlZVV7Nz2ppCZmWl2MemjvMYNpotd4VCL1NQU0tPSiU2KL/X2cs6Nr7zGLYQQwnwZvQ23Pnbu3Imfnx8eHh6aZUOHDtW8trGx4bXXXuPrr78uMeG2tbWlWbNmhgr1qcTGxppdTPoor3GD6WJPTMnA2bk69g72uHvULvX2cs6Nz5zilsRfCCEqBrMcpWT//v0EBwdrLQsPD+fSpUua92q1Gisrs/y+IIQQQgghhIbZJdwPHjzgxo0btG7dWmv51atXWbNmDSqViszMTEJDQ/H39zdRlEIIIYQQQujH5An3+fPnCQoK0ryPj4+ndu3aWFtba603ZcoUnJycCAwMZMCAAbRu3ZohQ4YYO1whhBBCCCFKxSRtMpYuXap57ePjozXUX4sWLYiKiiq0TdWqVVmyZIlR4hNCCCGEEKKsmPwOtxBCCCGEEBWZJNxCCCGEEEIYkAzzIYQQQqdjx46xcuVKsrOz8fb25qOPPsLBwUFrnYiICDZv3oyFhQVVq1Zlzpw5+Pj4ABAcHExmZqamT05gYCDjx483+ucQQghTk4RbCCFEIffv32fWrFls374dT09Pli9fzooVK/jggw8061y7do3ly5cTFhZGnTp1OH78OFOnTuXYsWNkZGRw48YNfvnll0Kd4IUQorKRJiVCCCEKiYmJwcfHB09PTwBGjBjB3r17UavVmnVsbGxYtGgRderUAaB58+bcvXuX7Oxszp07h52dHRMnTiQwMJCPPvqIzMxMU3wUIYQwObnDLYQQopCkpCRcXFw0711cXEhLSyM9PV3TrMTd3R13d3cgbzKyJUuW0KNHD2xsbEhPT6ddu3bMnz8fa2trpk+fzsqVK5kzZ06xx83KyjK7GTYzMzPNLiZ9ldfYy2vcUI5jt6tBamoK6WnpxCbFmzqaUikP51wSbiGEEIXk5ubqXK5QFH4wmpGRwcyZM0lKSmLTpk0A+Pn54efnp1ln4sSJTJ06tcSE29bWlmbNmj1D5GUvNjbW7GLSV3mNvbzGDeU39ssJd3B2ro69gz3uHrVNHU6pmMs5Ly7plyYlQgghCnF1deXOnTua98nJyTg5OWFnZ6e13q1btxg+fDiWlpZs3boVR0dHAI4cOcK///1vzXpqtRorK7nHI4SonCThFkIIUUinTp04e/Ys169fB2DHjh1ad6wBUlNTGTlyJL1792b16tVUqVJFU5aUlMSyZcvIzMxEpVLx5Zdf4u/vb8yPIIQQZkNuNwghhCikZs2aLFmyhGnTpqFUKqlfvz7Lli3j/PnzzJ07l4iICLZv387t27eJiorSmiH4yy+/ZPjw4SQkJDBo0CBUKhXt2rXjjTfeMOEnEkII05GEWwghhE5du3ala9euWsucnZ2JiIgAYPLkyUyePLnI7WfMmMGMGTMMGqMQQpQHknALIYQQQohSScnIJj0rB3tbK6rb2Zg6HLNn9DbcarWamTNnsnnzZp3lS5cupVu3bgQFBREUFMQ///lPTdn69evp27cvvXr1IiQkRGs8WCGEEEIIYRzpWTmsOxpHelaOqUMpF4x6hzsuLo4FCxZw9uxZvLy8dK5z5swZVq1aRZs2bbSWHz9+nAMHDhAWFoalpSXjxo2jcePG0glHCCGEEKIMJaZkAMjd6zJk1DvcoaGhBAcH069fP53l2dnZXLx4kS1btjBgwACmTp3KrVu3AIiKiqJ///7Y2dlha2tLcHAwkZGRxgxfCCGEEKJCy1SqWHc0Tu5elzGjJtzz5s1j4MCBRZYnJyfTvn173n77bSIiImjZsiWvv/46arWa27dv4+rqqlnXxcWF5ORkY4QthBBCCCHEUzOrTpMeHh5s3LhR837cuHF89tlnJCYm6myvrWvGsyfJNMFlp7zGDaaLXeFQ65mmypVzbnzlNW4hhNBXfodHkGYjxmJWCfelS5e4dOmS1l1wtVqNtbW1zlnPXFxcStynTBNcdspr3GC62BNTMp5pqlw558ZnTnFL4i+EMIT8Do93E21xSvLkx2hIfVgdx8YWPJdjidoSLCxMHWXFYlYzTSoUChYvXkxCQgIA27Ztw9vbGxcXF/z8/IiMjCQjI4Ps7GzCwsLo2bOniSMWQgghhCh/zhyqwea3vFi11BorK6hTN5ez0TUYO8yOgxvqoVLmZdyJKRmkZGSbONryz+R3uAvOWvbcc88xd+5cJk+ejEqlwsXFhVWrVgHQo0cPrly5wpAhQ1Aqlfj5+RXbHlwIIYQQQmjLzYUlC6w5uMGNxm0fsvMbK9o0teNywgM2nUjm0c9ebAipyb1btgxtpWL379d5o3tjaXbyjEyScC9dulTz2sfHRzNrGaAZf1uXSZMmMWnSJIPHJ4QQQghRES1aBJ99ak3rPvfoNe4Wdeo21pRZWauZPjebW4q/2L/OjXdez6VD0ZPJilIw+R1uIYQQQpSOdHoTT+OXX2DhQhg0JIfnht3StNNOTMlAYWWtWe+FLqlkZSg4tNENS/da4Je3vOB1p1TJ5IOlYVZtuIUQQghRsvxObzJWstDXw4fw6qvg4QGLlmdrku38cbdzn1i/dZ/79A5QcjzUhf/+Jy9dLHjdqXKf3EIURxJuIYQQQogK7t13IT4evvkGHB1LXt/CAj5alYlDdSVvv25DjnyveyaScAshhBBCVGCxsbBpE0ybBh076r+dkzP4vXabq1cUfPWV4eKrDCThFkIIIYSoYFIysklMySAxJYMZs3Oxs4PZs0u/n+faPaR1WxXz58Pjx2UfZ2UhCbcQQgghRAWT39567sZb7A1X8M47ULv0869hYQGzPlBy8yZ8uVHG2nhaknALIYQQQlRQx7fVpXoNNW+//fT76NAxF39/WLfamsx0SR2fhpw1IYQQQogKKCmuCtfPVuP1aUq9OkoWZ8ECeMrD7KcAACAASURBVPDAgvNHq5dNcJWMJNxCCCF0OnbsGIGBgfTp04dp06aRlpZWaJ2IiAgGDBhAUFAQw4cP5/z585qy9evX07dvX3r16kVISAhqtYzbK4Qxnd5fC+sqKl4Z8+xDjPj6wovtVPy2vya5qjIIrpKRhFsIIUQh9+/fZ9asWYSEhHDw4EE8PDxYsWKF1jrXrl1j+fLlbNq0iYiICCZPnszUqVMBOH78OAcOHCAsLIx9+/Zx6tQpfvjhB1N8lEqtimMNElMySMnINnUowsju3oHYGCd8uqU+893tfGMn5pCabMsfv1Urmx1WIpJwCyGEKCQmJgYfHx88PT0BGDFiBHv37tW6S21jY8OiRYuoU6cOAM2bN+fu3btkZ2cTFRVF//79sbOzw9bWluDgYCIjI03xUSq17FyFTI5TSYV+ZYUqR0HbfvfKbJ99+6twrJXN6e9rldk+KwtJuIUQQhSSlJSEi4uL5r2LiwtpaWmkp6drlrm7u9OtWzcA1Go1S5YsoUePHtjY2HD79m1cXV21tk9OTjZa/EJUZkolbN1iRcNWj6jpnlVm+7Wygjb97nHjggOXfpcUsjRkfBchhBCF5BYxbbNCUfiPbEZGBjNnziQpKYlNmzYB6GyvrWvbJ2VlZREbG1vKaA0rMzPT7GJSONQiNTUFgPS0dGKT4nWvaFeD1NQUnetUcaxBdq4CG0UumQ/vGzrkUjHHc64vY8ae/zsEtH6PBw5U468kd/oNjdf5+y94/ahUHnmv1Xk/Ne8LlOVvr3Cohafvn1hur8uOr62o1kn3tWVs5eF6MWrCrVarmTVrFl5eXowbN65QeUREBJs3b8bCwoKqVasyZ84cfHx8AAgODiYzMxNra2sAAgMDGT9+vDHDF0KISsPV1ZWzZ89q3icnJ+Pk5ISdnZ3Werdu3WLSpEk0btyYrVu3UqVKFc32d+7c0dq+4B3zotja2tKsWbMy+hRlIzY21uxiSkzJwNk5b7QIewd73D10D7B8OeEOzs7Vda6TmJLB50fjeKN7Yxq61TV4zKVhjudcX8aMPf93CGj9HqdPB9d6ufh0UqOwLPz7L3j9WFpa5r22AGfn6v97X6Asf/vElAxc3KvxXLuHfB/uxPg+NYq9/ozFXK6X4pJ+oz0PiIuLY/To0UV2mimu801GRgY3btwgIiJC80+SbSGEMJxOnTpx9uxZrl+/DsCOHTvw8/PTWic1NZWRI0fSu3dvVq9erUm2Afz8/IiMjCQjI4Ps7GzCwsLo2bOnMT+CEJVSUhIcPAjBw1QoLA1zDJ/uKaSmWPDHaek8qS+j3eEODQ0lODiYevXq6SwvrvPNuXPnsLOzY+LEidy5c4cOHTrw9ttva1XuQgghyk7NmjVZsmQJ06ZNQ6lUUr9+fZYtW8b58+eZO3cuERERbN++ndu3bxMVFUVUVJRm2y+//JIePXpw5coVhgwZglKpxM/Pj4EDB5rwEwlROYSGgkoFQ4bncCDRMMfwbJFGXZfcvDG5n2K6+MrIaAn3vHnzADh58qTOcnd3d9zd3YHCnW/S09Np164d8+fPx9ramunTp7Ny5UrmzJlT4nGlPWDZKa9xg+liz28n97Rt3OScG195jdsQunbtSteuXbWWOTs7ExERAcDkyZOZPHlykdtPmjSJSZMmGTRGIcT/qNXw1VfQrh009lKDgRJuhSUMHKLk83XV+Cv5Me4yF06JzK7TpK7ON35+flqPMidOnMjUqVP1SrilPWDZKa9xg+liz28n97Rt3OScG585xS2JvzCWxJQM7G2tqG5nY+pQhB5SMrJJz8pBqdLunPzf/8L58/DZZ4aPYdCwHDaE2LJnlxVt3jf88co7sxrT5datWwwfPhxLS0u2bt2K4/+P1H7kyBH+/e9/a9ZTq9VYWZnddwUhhBCi3MlUqmSs7nImPSuHdUfjUD0xmtDWrWBjA8OGGT6Gxl651PPKIGyn5GP6MJuEu7jON0lJSSxbtozMzExUKhVffvkl/v7+JoxWCCGEEMJ85ObCt9+Cvz/UqFG43BAzjjbrlMrFCwquXCnT3VZIJk24z58/T1BQEIBW55ugoCDNv5SUFIYPH86LL77IoEGD6NevH3Z2drzxxhumDF0IIYQQwmz8+5SC27d139021FOMph0eALBzZ5nutkIy+nOApUuXal77+Pjo3flmxowZzJgxw+DxCSGEEEKUN/vCLalSBfr3N94xq9XM4cX2Kr791pK5c4133PLIbJqUCCGEEOLppWRkG6TZgDB/uSrYv9eSgABwcDDusQcMUnHhAly8aNzjljeScAshhBAVwOn/qOg7MIumja1wcoJq1eDtN6px/Zw9T/StExVM4iU7/kpSMGSI8Y/dLzAHCwvYtcv4xy5PyiThvn//flnsRgghhBFInV2xpKfltdvt3bkqV391pHPXXMaOhREj4OcfbdixoBEjBtly966pIxWGcumEM1WqqgkIKHndxJSMQsMJPou6LtClS16HTXXZ7bbC0Tvhbtasmc5KOjExsdB0v0IIIUxL6uzKIS3FiiGBVdi9G956T8nrGy7xyb+yWb0aPv8cfvz3PXr/4ya//arA1zdvnGZRseSq4PJJR/x6qUpsTpLfefLJ4QSf1dChEBub90/oVmynyT179vDdd98BeWNfT548udD413fu3NFMxy6EEMJ0pM6uXB7esyJ0bmOy0yyIiICWf1Oy7qh2ImVbBdr0vc/UYTWZNLoKXbvCL7/A88+bKGhR5m5dtSM91Zp+gVmYaj7DoCB44w0ID5drqyjF/mb69OnDzZs3Afjtt99o06YN9vb2WuvY29vTu3dvw0UohBBCL1JnV3z5MwymZagJX96Axw8t2b0viwC/KiSm/G+9xJQMABRW1gC0apPLiRPw0kswYACcOoX04qogrpxyRGGVS49eKqDoWSgNyc0tbzr5PXtg9myjHbZcKTbhtrOzY8qUKQC4ubnh7++Pra2tUQITQghROlJnV3z5MwzGR3pz66oNA6fH06pNba11MpUqNsdcB2BMBw/N8vr18xKibt1g8GDY8q0RAxcGoVbDlV8d8fRJp5qjJfC/a2RcJ0+jxjJwIMyaBQkJ4OFR8vqVjd7PHgYNGkRcXBwXLlwgJycH9RMt4wcPHlzmwQkhhHg6UmdXXBeOO7PvKxvaD/yLph0eArVL3CZfhw6waRP8/e/wrzVWWLYxXJzC8P64rCA1yZZ2QXeB6iaNZdCgvIQ7IgL+/3u/KEDvhPvzzz9n1apVODk5FXpEaWFhIZW3EEKYEamzK6b79yB6iyttX8qhyyvJT7WPUaNg3z74dLk1o5fLE5DyLOqHvDTO68WHmDrh9vaGpk3z2nFLwl2Y3gn3F198wbvvvsu4ceMMGY8QQogyIHV2xbR4vg3Zjy35cHkGPz7DMH9r1sDBQ/DDejemD5VBusur6ANW1HsuA4fqZTtl+9MaNAg+/hju34caNUwdjXnRu8uEUqmUjjZCCFFOSJ1d8fz4I+zcZsVLgXfwavp0SXL+bJRKmwxmL8gmMdaeXaHWZRypMIaHd605/19LnnvpgalD0Rg0CFSqvCcoQpveCXdQUBChoaGF2gEKIYQwP1JnVywqVd5jenePXP425K+n3k9+h7p1R+MYNCwb92bpfLLMhuzHMmRJeXP139UA8HrxkYkj+Z+2bcHVFfbuNXUk5kfvJiUpKSkcOnSIvXv34ubmhrW19jfi0NBQvfajVquZNWsWXl5eOh91Hjt2jJUrV5KdnY23tzcfffQRDg4OqFQqlixZQkxMDCqVirFjxzJixAh9wxdCiEqlrOpsYTz5w7nZ21pR3c5G8x5g/x4bzp+3Yt0mJQlVyuZLlIUFdB+VxNezG3P6+5rgXya7FUbyx2lHPBvlUtM9y9ShaCgU0L8/bN+h5lryY6pXy7uWRSkS7kaNGjFp0qRnOlhcXBwLFizg7NmzeHl5FSq/f/8+s2bNYvv27Xh6erJ8+XJWrFjBBx98wI4dO4iPj2ffvn2kp6czbNgwXnjhBVq0aPFMMQkhREVUFnW2MK78u89vdG9MdTsbzXtVDuxc9AItW0L/gSr+dbzsjunmnUHPvkp+iqhNyodZuJu2353QU9ojuHHBntHjzaPtdkGBgbBxowWzP0tmxT/rSsL9//ROuKeUQZfT0NBQgoODqVevns7ymJgYfHx88PT0BGDEiBEEBQUxf/58oqOjGTp0KFZWVjg5OREQEEBkZKQk3EIIoUNZ1NlFPXF8UlFPLtu3b0/dunU178eNG8eAAQOeOa7K5vzR6sT/qSAkMu8OYll7e1Y2hw/ZEbLKms/Xlf3+Rdn76ZglqhwFPXrncMHMWo35+YFtFTV/nK5m6lDMit4J93vvvVds+ccff1ziPubNmwfAyZMndZYnJSXh4uKiee/i4kJaWhrp6encvn0bV1dXrbLLly+XeMysrCxiY2NLXM+YMjMzzS4mfZTXuMF0sSscapGamkJ6WjqxSfGl3l7OufGV17if9Kx1dnFPHAsq6snltWvXcHJyIiIi4qk/g4AcpQU/76pD67Yq+ve35Gaq7vUSUzKeemZBr6a5vNAlla2bnflwHhT4jiTMTH4zo4M/WGNrr6LNSyounDLOsUu6xgo2gerYxYbfTjuiVpvfHXhT0TvhtrS01Hqfk5NDQkICsbGxjB49ukyCyc3V3etaoVDo7Pij0OOrvq2tLc2aNXvm2MpSbGys2cWkj/IaN5gu9sSUDJydq2PvYI+7h/6TU+STc2585hT3syT+z1pnF/fE0cLCQrNeUU8uz5w5g0KhYNSoUaSmptKnTx8mT55cKC5RvAvHnHl0z4bpn2diYaH73OXPLPksMwt2CP6L3487s2YNLF781LsRBpaelUNIdBxHo16gceuHWFsb5/+TPtdYfhMogO69vDhyqAqXY1V4dDRKiGZP74R7yZIlOpd/8cUXXLx4sUyCcXV15ezZs5r3ycnJODk5YWdnh6urK3fu3NEqK3g3XAghxP88a51d3BPHgs1KinpyqVKp6NixI++99x6ZmZlMmDABBwcHxowZ8xSfpnLKzYVfI2tTt9FjOndTP9Nd7JLUdMumX38V69ZZMWMGODoa5DDiKRS8c6xUqbn9hx337yno5Gv6yW7yPXltdu+dA+9C1AFLekrCDZQi4S5Kr169WLNmTVnEQqdOnVi2bBnXr1/H09OTHTt24OfnB4Cfnx+7d++me/fuZGRk8P3337NgwYIyOa4QQlQW+tbZxT1x1MfQoUM1r21sbHjttdf4+uuvS0y4K3MzwCeboB35uR73b9nRc2IsGVmufPLDOf7ZrwWpqSmoVB6kpqYAaF4/+RMAtYfWPvOPoWu71yY8Yv/e6nz4YTJjx943+OctTnlu2lXWsSscavFJVN7+/tmvBRdirLG0VFOzUSIqlaPm9/nk71jfa0TzWl10WXHbpWdma12bALVqe1Db8xEH91dhzCuG/z2Wh+tF74RbV+Wbnp7Ojh07qF796b9hnT9/nrlz5xIREUHNmjVZsmQJ06ZNQ6lUUr9+fZYtWwbkPc68ceMGQUFBKJVKhg0bxksvvfTUxxVCiIrsWevs4p446iM8PJymTZvStGlTIK9jpZVVyX9yKnMzwIJN0NzcazPy7yqc6mTTxi8HS0tLnJ2rF/oJFFuGBVrN2vKPoWu79h1t8fOD0NC6LFpUF1sTzvpuTk27SqusY3/yd5Z4oTZt26mo61ZN63f95O9Y32tE8/r/r5XSbldUmXe7DH7e6UCtWs2oXfoWlaViLtdLcUm/3gn3888/r9VuL5+trS2LFi0qVUBLly7VvPbx8dHqVNO1a1e6du1aOFArK+bMmVOq4wghRGX1rHV2cU8c9XH16lUOHTpESEgISqWS0NBQAgMDS/UZKrOff4b/nLak17hkFEZs9j5jBvTuDdu3g7T+MT83Eyy4c6Mq48ZmmjqUEjVp+5CYb+vyww/w97+bOhrT0zvh3rp1q9Z7CwsLrK2tadKkic5hooQQQpjOs9bZRT1xLPhUsjhTpkxh4cKFBAYGkpOTQ9++fRkyZMgzfabK5JNPwLm6Gp8exm3a0bMnPP88hITA6NF5k+MI83EsOi9t694rh6NJJg6mBHUbZlLHJZd9+xSScFOKhDu/+UZcXBxxcXGoVCoaNmwoybYQQpihsqizdT1xdHZ21plsF3xyCVC1atUiO26K4t1KtCA8HCa8kYNNGc0qCfoNHWhhAVOnwuTJ8Msv8Le/ldnhRRk4Gm1FdZcsGjZWm33CbaEAv165fB+hIDsbbCr5/Dd6J9wPHjxgxowZHDt2DCcnJ1QqFenp6fj6+vLZZ59RrZoMcC6EEOZC6uzy65uvrMjNhVFjc4iMK5t9lmbowJEjYeZMWLNGEm5zkp1pwS8/WdKiVyoWFiZsYF8KPXqr2P61FTEx0KOHqaMxLb3nrPrwww+5c+cO+/fv59SpU5w+fZq9e/fy+PFjuYshhBBmRurs8ilHacG2r6wIDASP+qaZQlCpyGboq0p271bz+x/ZJolBFBZ/3oHsLAuatHlY5DqGHDryaXTuqsLGBvbtM3Ukpqd3wn306FEWLFhAo0aNNMuaNGnCvHnzOHz4sEGCE0II8XSkzi6fLp1w4t5dC6ZMMV0M6Vk5WL4QR44KNm6QRtzmIu63atjbq/F4PkNneaZSxbqjcaiKGNLTFOwdoHt3SbihFAl3lSpVdC63sLBApVKVWUBCCCGendTZ5dN/DtSksVcupRgQxiCcXZQ0apXG9m8syZHZuU1OrYa43xzp1D0HS2vzuYOtj/794epVuHzZ1JGYlt4Jd48ePVi4cCF//vmnZtm1a9f48MMP6d69u0GCE0II8XSkzi5/Ll6w4NYVO0aOyUHP+YUMqlXve/yVpNC6O5mSkU1iSgaJKRmkZEhzE2NJ/rMKj+5b071X+fv207bzYwC+/97EgZiY3v+l3333XWxtbenXrx++vr74+voSEBBAjRo1eP/99w0ZoxBCiFKSOrv82bbVCkvrXF4ebh5JVZO2j3BxzWXDhv8tS8/KYd3RONYdjdNMNy4ML+43R7BQ082vfD2dylSqiIz7A+9muZW+WYleo5ScO3cOb29vvv76ay5fvkxcXBzZ2dm4u7vj6+tr6BiFEEKUgtTZ5U9GBoR9a0XTDqlUr24eI1AoLGH4SBWfrlBw/Tp4epo6osrrj9PVqOf1mJq11VAOm2b07KNiw1oFqang7GzqaEyj2DvcOTk5vPvuuwwbNkwzxa+3tzf+/v4cP36cUaNGMXfuXGkPKIQQZkDq7PJr50549MiCVr2MO9FNSUaMysHCAjZuNHUklddfyXD7DzuatC16dBJz59dbRU4OHDxo6khMp9iEe8uWLZw6dYqtW7dqJlHIt3r1ar744gsOHz7M119/bdAghRBClEzq7PLr88+hiVcu7s10j0BhKvXc1fj7w5YtSOdJEzkSZQlAE99HJo7k6bV5MZeaNSv3aCXFJtx79uzh/fff58UXX9RZ3r59e9577z2+++47gwQnhBBCf1Jnl08XLuTN6jji7zlmOZX6P/4BSUmwdWeWWY3xXFlEH7TEsVY2tRtkmjqUp2ZpCd165rDvezV3H1XOzrbFJty3b9/m+eefL3YHvr6+JCYm6nWwY8eOERgYSJ8+fZg2bRppaWla5eHh4QQFBWn+9ejRgxdeeIG7d+8CeX8sCpZHRkbqdVwhhKgMyrrOFsaxeTNYW8NgM+ks+SR/f6jjksuS1VlmNcZzZZCZCT8ds6SJ7yOz/DKmr0ylihy3W6SmWPBjTOW8hortNFmrVi0SExNxc3Mrcp1bt25RvXr1Eg90//59Zs2axfbt2/H09GT58uWsWLGCDz74QLPOwIEDGThwIABKpZKRI0cyYcIEatWqxbVr13ByciIiIkLPjyaEEJVLWdbZwjiSUrL58itr+gSoqOb8v7vH5jRjoJUVDBmu4rM11UhOSjd1OJXKsWOQkW5B4zbltzlJvoatHqGwVBN9wJLgfqaOxviKvcPdq1cvQkJCUCqVOsuVSiVr166lS5cuJR4oJiYGHx8fPP+/m/OIESPYu3cvarXuCmXjxo3UqFGD4cOHA3DmzBkUCgWjRo0iMDCQtWvXSscfIYQooCzrbGEce/aoSU2xwN4nQXP32BxnDBz2ag7qXAv2fGtt6lAqlchIsLNX08AnreSVzVwV+1zqv5BG1A+Wpg7FJIpNuF9//XXu3LlDcHAwO3fu5OLFiyQkJHDhwgW2bdvGwIEDuX37NlP0mIM2KSkJFxcXzXsXFxfS0tJITy/8bfn+/ft88cUXzJ49W7NMpVLRsWNHNm/eTGhoKDExMdLxRwghCijLOlsYx45vrHCslY1nC/NOqBo2VlP/hTR2bbNGbT7fAyo0tTov4e7aXYWVjXk87XhWTV58xB9XFVy5YupIjK/YJiXVqlVj586dLF++nKVLl/L4cd5sQWq1GicnJ/r3788bb7xBjRo1SjxQbhHf1BU6ptPauXMnfn5+eHh4aJYNHTpU89rGxobXXnuNr7/+mjFjxhR73KysLGJjY0uMz5gyMzPNLiZ9lNe4wXSxKxxqkZqaQnpaOrFJ8aXeXs658ZXXuKFs62xhePHx8NMxBX8bchcLM5hZsiQt/FLYt8aBG7/b08BHmpYY2n/+AzdvwjuzVfxl6mDKiJfvQ6I312PvXnjnHVNHY1wlTnzj5OTEokWLmDdvHgkJCTx8+JDq1atTv359nclyUVxdXTXjwgIkJyfj5OSEnZ1doXX379/P3LlztZaFh4fTtGlTmjZtCuT9AbGyKnneHltbW5o1a6Z3nMYQGxtrdjHpo7zGDaaLPTElA2fn6tg72OPuUbvU28s5Nz5zivtpEv+yqrOF4X35Zd7PFt1TTBqHvrzbP+D4l+6cO1JdEm4jiIwEhSJvDOvt50wdTdlwqqPk+ea5REYqKl3CrXfta2NjQ+PGjWndujWenp6lrrg7derE2bNnuX79OgA7duzAz8+v0HoPHjzgxo0btG7dWmv51atXWbNmDSqViszMTEJDQ/H39y9VDEIIUVk8a50tDCs3F774Ajp1zcWpju429+bG2lZNYLCSyyedyEyX68nQIiKgY0eoUdPUkZStXn1VxMTAvXuFy1IysklMySAlo+INHWi0/zE1a9ZkyZIlTJs2jX79+nHlyhVmzJjB+fPnCQoK0qwXHx9P7dq1sbbW7pgxZcoUnJycCAwMZMCAAbRu3ZohQ4YYK3whhBCizBw5ktekZPhI8xwKsCiDRyjJyVYQG1NJ5+c2kvh4OHsWCqRHFUavfipyc2H//sJl6Vk5rDsaR3pW+fp/oY+S22SUoa5du9K1a1etZc7OzlpD/bVo0YKoqKhC21atWpUlS5YYPEYhhBDC0DZvhurVobe/is2/mDoa/TVvmUvt+o85d0SGljSkvXvzfg4YYNo4DMGnZS716uXdwR81ytTRGI88ExJCCKFTSZOV5VOr1cycOZPNmzdrlqlUKhYtWkTfvn3p1asX27dvN1bYZi0lI5vz1zLYs0fNyJFQpYqpIyodC4u8zpO3/7Aj9mI5nonFzIWHQ9Om4OVl6kjKnkKRd+f+hx/g//t1VwqScAshhCgkf7KykJAQDh48iIeHBytWrCi0XlxcHKNHj+aHH37QWr5jxw7i4+PZt28f3333HV999RXnzlWQnl/PID0rh3c+SiUry4KxY00dzdN5oUsqlla5fPu1UR+SVxr37uVNePPyy6aOxHCCgyEjAw4dMnUkxiMJtxBCiEL0nawsNDSU4OBg+vXTnjouOjqa4OBgrKyscHJyIiAggMjISGOFb9bOHqlO8xa5tGpl6kiejp2jCq8XH7J7pxVZWaaOpnzRp1Pg3r2gUsGgQUYMzMi6ds1rUhUWZupIjEe+ngohhCikuMnKHBwcNMvnzZsHwMmTJ7W2v337Nq6urlrbX758ucTjVvS5E2L/dOGvP6szadEjYmMTNWP1A6hUHqSmphT6+SxlqPXfLn++gIIxPbksf93G7eHSL86sW5dIv35lP+14eR4Pv7jYFQ61+CQqln/2akZS/F2d62zd6o6raxWqVv2D2FgMfo1oXqvLfp+6ytLT0vkjKZ4uXVwJD6/GuXNXyB8n42nnrigP14sk3EIIIQopzWRlujx5J1zfbSv63AlLViixssll6KuWNPNsphmrH8DS0hJn5+qFfj5LGRbovV3+fAEFY3pyWf66Tn+D/+7K5eBBd95+u0xOjRZzGg+/tIqLvaS5GR49ghMnYPJkeP75ZlrbgGGuEc3rJ64VQx0v/7OPGZPXcfKvv5rRs6d+5+dpzrkxFZf0S5MSIYQQhbi6unLnzh3N++ImK9N3+4J3zCujjAwI32WFd4cHODmZOhr9JaZkoFRpf4GyUMCwV3OIilJz7lLFGzPZWJ5sYnLgAGRl5bVxruh69wY7u8rTrEQSbiGEEIXoO1lZUfz8/Ni9ezc5OTk8fPiQ77//np75t7Eqqe++g0ePLGjpVz5mlgTIVKpYdzQOlY4nHkFDs1EDX34ho5U8rSfHnQ4Lgzp14G9/M3FgRmBnB/365Y3IUsQDtQpFEm4hhBCF6DtZWVFGjBiBh4cHQUFBDB48mMGDB/PSSy8ZIXLztXkzeDbKxeN5850WXdfd7KLUc1fTsEUa34ZaolIZOLBK4OqtDPbuU9M3QIWlpamjMY6XX4bbt+Hnn00dieFJG24hhBA66TNZWb6lS5dqvbeysmLOnDkGja88uXwZfvwRZs7LATO9IZypVLE55jrjOnnqvU3LXvcJX1GNgwfB399wsVV0mUoVMz65T3paA/oGKoHKkXH37583Fv3OndC5s6mjMSy5wy2EEEIY2Oefg5UVDBnxvymrS3M32Vx5vfiQ2nXUfP65qSMp/2J/dsLOMYcOnfLaV+S37y7v14gu+e3Wq1WDgIC85lYV/SmJJNxCCCGEAWVmwpdf85aVGgAAIABJREFUwsCBUKfu/y8rpm10eWJpBUNfyWHfPrh509TRlF8Z6RD3myPeHR5g9f9tD/Lbd5f3a+RJ+dd+frv1oUMhKQl++snEgRmYJNxCCCGEAYWFwf37MHGiqSMxjOGjclCpYMsWU0dSfh2NskKZpaBZxwemDsXoAgLyOlB++62pIzEsSbiFEEIIA9qwARo3hh49TB2JYXg2VNOrF2zaVPGbBRjK9xFWOFRX4t7UfDvUGkq2RTY9euew6zs1j7MqXvOZfEZNuI8dO0ZgYCB9+vRh2rRppKWlFVpn6dKldOvWjaCgIIKCgvjnP/+pKVu/fj19+/alV69ehISE6JxYQQghhDAXsbF5nSUnTAA95wwqlyZMgBs38saRFqWTlaHg+OG88dkVlaOvpJb0rBysvW5y764FP/9kpj2Ky4DR/vvfv3+fWbNmERISwsGDB/Hw8GDFihWF1jtz5gyrVq0iIiKCiIgIPvnkEwCOHz/OgQMHCAsLY9++fZw6dYoffvjBWOELIYQQpbZ+PVhbw5gxpo7EsIKCwNUV1q0zdSTlz5VTjmRnWVTK5iT5nUIbtX6ErZ2KyO+sTR2SwRgt4Y6JicHHxwdPT08gb4zWvXv3at2lzs7O5uLFi2zZsoUBAwYwdepUbt26BUBUVBT9+/fHzs4OW1tbgoODiYyMNFb4QgghRKk8epTXWXLo0LzJTCoya+u8u9wHDkBcnKmjKV8uHK9Ofc9c3LwzTB2KURXsOGxtq8a7wwMO7rMiO7Ni3uU22jjcSUlJWtP6uri4kJaWRnp6Og4ODkDe1L/t27fn7bffpmHDhmzevJnXX3+dPXv2cPv2bTp06KC1fXJyconHzcrKKnZue1PIzMw0u5j0UV7jBtPFrnCoRWpqCulp6cQmxZd6eznnxlde4xbm55tv4OFDmDLF1JEYx4QJsHgx/OtfoOMBttDhZqIF8RfsmfZuNhYVM8/UW/OuKZw7XIOrvzpBP1NHU/aMlnDnFjGsjaJAozYPDw82btyoeT9u3Dg+++wzEhMTdbbXVujRIM7W1pZmzZo9RcSGExsba3Yx6aO8xg2miz0xJQNn5+rYO9jj7lG71NvLOTc+c4pbEn/zl5KRTXpWDva2VlS3s9EsV6th7Vpo2xbatTNhgEZUrx4MGpQ3WslbM7NRWxY+L0Lbnl2WoLYg6GUlUYmmjsa0PJpl4OaRy4VjzjA/7+9nRbp+jNakxNXVlTt37mjeJycn4+TkhJ2dnWbZpUuXCA8P19pOrVZjbW2tc/uCd8yFEEIIY8sfKzl/TOF8x47BxYt5d7cr053LN96AlBTYvk2t87yI/1GrYfcOK9ybpVPfUwaBsFDAgJeVXD/vwI3E3Ap3/Rgt4e7UqRNnz57l+vXrAOzYsQM/Pz/tYBQKFi9eTEJCAgDbtm3D29sbFxcX/Pz8iIyMJCMjg+zsbMLCwujZs6exwhdCCCH0tnYt1KippmPvDJIfPiYxJaPCzhpYUJcu4OPD/7V37/E51//jxx/XYefNzmwMsznmEJUiQyghs8hxIdEvpyiElFBOEfHVCZUURflQqJAzQzo4VnIeZjOHnex4nd6/P95t2QxT2/XetT3vt9t1m+t6v6/t+b729tzz/Xq/DnyyyAmZSOz2fv0VTp3U0/CRZK1DKTWe7GFGselYt9puHTDsxm4Ft7+/PzNnzmTkyJF07NiREydOMH78eI4ePUpUVBQAtWvXZuLEiQwdOpSOHTuyZcsW3nnnHQDatm1L+/bt6dGjB507d6ZBgwY8+eST9gpfCCGEKJIzZ+Dbb6FPfwtLfjrN9Wy1FbwsrhpYkE4Ho0bBX3/qOXfEQ+twSrWlS8Hl78GCQhVWU6FyrUxWryx7F2x2vYRo3bo1rVu3zveaj48Pa9euzXueO/92YYYMGcKQIUNKNEYhhBDiv5g/HwwGGPCchdV/aR2N/UVHw/hXFH75LgBeuvP+5VFmhjqotlMXK64eZfsi7G7d+1gSGz4IIe4vdyhDi0WV4Wn4hRBCCPtKTlYHDUZHQ1BwGWuiKyIXF+g/yMzpAxU4ebwcdWC/C+u+MZCWBk8PKDt9lItLvRYpeHopHNrsl+/15EwTccmZJGeaNIrsv5GCWwghhCgmixZBRgaMHq11JNrq96wFo7ONTxaWvb64xeGLpUbq1YMHm0nrdkHOrgpR3c38tdeb5Bu6t99qgLKjkIJbCCGEKAYmE7z7LjzS1oZf1bI/QPJGBVse/QPUeZX/t9LIb8cct1WyJCSedeXQAQO9+5uw2Ao/R8rDANvb6dXPjNWsZ81XZeeCTQpuIYQQohh89hnEx8Nzw0zlYoBkrtwVAwu2PD705FXMZhj2SobDtkqWhEM/+uHiqpBc+WSh58iNKzCWV/Xq2wiulckXS41lZvCkFNxCCCHEf2Q2w8yZ0LQptGpTfgulG/kGmejc1cLBH/1ITtI6mtIhNRX+2OVDpygLrp5yntxOk/bXOHlCz9atWkdSPKTgFkIIIf6jtasNnD0Lr79evha6uZPBI0yYsw0sWeSkdSilworPjJiyDQx4XrrY3Mk9LVMJrKgwY5a1THSxkYJbCCFEoXbs2EFkZCSPP/44I0eOJD09/a72adasWd5Ur1FRUaxbt86e4duNzQrvvuPEvfdC585aR1O61K5no9aDqXy62EhamtbRaMtshiWLjVRvmM49DaR1+06MTgrRz5rYvsXAG8viHL6LjRTcQgghbpKUlMSECRN499132bRpE1WrVmXOnDlF3ufMmTN4e3uzdu3avEeXLl20OJQS99deb86c0jNxorRuF7aiZovul0lN1TFvnoaBlQJffw0J8XqaRl7VOhSH0ae/GaOzjV+/89c6lP9MCm4hhBA3iYmJoWHDhoSGhgLQp08f1q9fj3LDCKbb7XPw4EH0ej39+vUjMjKS9957D6vVqsGRlCyzGXavrETde2x066Z1NNrKHexXcMBfUHg2nSItzJ0LV8tprakoMHcu1KxlI7zJda3DcRj+AQoNWifz+05frl117KvZsjPfihBCiGJz6dIlgoKC8p4HBQWRnp5ORkYGnp6ed9zHarXSokULxo0bR3Z2Ns8//zyenp4MGDDgtj83JyeHY8eOlcgx/VvZ2dm3jOmrb0JIvuTOzJmpHD8eD4DeM4CUlGSs1qr5vgI3vVbS21Du/n0lEdOwF9PY+L0vY8cmMW7c5f/0mZd2hcW+d687Bw9W5823MohPs89nfrfbCp4rWsZy49c6rc9waMsDfLrIiO7eZDLSMzh26dwdP/PSRgpuIYQQN7Hdor+kXq8v0j49e/bMe+7s7Myzzz7LsmXL7lhwu7i4UK9evbsPuAQdO3as0JgyMuDDBQoh9TLo1MUJna46AGargo+PLwaDId9X4KbXSnobOu76fSUR0733udKvn44VK/yZOtWfkJB/95k7goKxKwo89xyEhED0MwY+3mufz/xutxU8V7SM5cavNeq5Uu/hVJZ/4s1z7wfg4elBSNXA237mWrld0S9dSoQQQtwkODiYK1eu5D1PTEzE29sbd3f3Iu3z7bff8tdff+VtUxQFo7FstfHMnw+XE3U80vcSOZbCu1OIf0yZAjYbTJyodST2tXkz7N0Lr72mLnsv7t7D3S+TmQk/rwvQOpR/za4Fd1FGvOcOrImKiqJ3794cPXo0b1u3bt3o1KlT3oj3jz/+2J7hCyFEuREREcHhw4eJjY0FYOXKlbRr167I+5w8eZIFCxZgtVrJzs7miy++oFOnTvY8hBJ18SK89Ra072QhpG6m1uE4hNBQGDVKXSBo/36toyl5yZkmLiRlMuE1G1VCbLTv6vhT22klsFoOnbpY+O0Hf5KuaR3Nv2O3grsoI97PnDnD22+/zccff8zatWsZOnQoI0aMACAzM5Pz58/nG/H+3HPP2St8IYQoV/z9/Zk5cyYjR46kY8eOnDhxgvHjx3P06FGioqJuuw/ACy+8gLe3N5GRkXTp0oUmTZrQo0cPLQ+pWI0bpw6YnDTNrHUoDmXiRAgKgpEj1dbusiwjx8KYuZc58Kuehp3j+WiP3P34L4aPNmHK0bPwXcec091u9/cKG80eFRXF5MmT0f09j5KzszPTpk2jYsWKADRo0ICrV69iMpk4cuQI7u7uDB48mCtXrtC8eXNGjx6Nq6urvQ5BCCHKldatW9O6det8r/n4+LB27drb7gPg5ubGzJkzSzxGLezcCV9+CZMmQfVQBc5qHZHj8PJS7wwMGADLlsEzz2gdUcmxWGDH8iBCqtlo+EiK1uE4vFp1bdRvmcKSRT6MfQlq1NA6ortjt4K7KCPeQ0JCCPl7JIWiKMycOZO2bdvi7OxMRkYGDz30EJMnT8bJyYmXX36ZuXPn8tprr9325zraiPfSzFHjBu1iz52toLBR1UUhn7n9OWrcwj7MZhgxAqpWU+j7fJZ0EbgLcclq15vOTxl56ENnXn5ZoUmLLKpWNuLr7qxxdMVv+VIjV8478/6nWVxwkvOkOLTue4nTv/gwfrw6r7kjsVvBXZQR77kyMzN55ZVXuHTpUl4/7Xbt2uXrPzh48GBGjBhxx4LbkUa8l3aOGjdoF3tcciY+Pr6FjqouCvnM7a80xS2Ff+kzcyYcPQofLzexZP9pBkWEah2SQ8g2W/kkJhaA4W3CWbzYmQcegD4DTWxaS5kruK9dgzkznKjeMJ3HOios2aN1RGVDBX8Lw0aaeWeWM7t2QatWWkdUdHbrw12UEe8A8fHx9O7dG4PBwOeff06FChUA2LZtG7/88kvefmVxxLsQZYlrBT/ikjNJzjRpHYoQxeLQIZg6FaKj4fFOZW8RH3tq1AhGjDbz524fftxg0DqcYjdpEqRfh0cHxpf71UeL25ARFipXsfHCCBsWi9bRFJ3dCu6ijHhPSUmhb9++tG/fnnnz5uXrn33p0iVmzZpFdnY2VquVpUuXlqkR70KUNSabnve3nyYjx4EyohC3YDKp/Y4DAmDBAq2jKRuGj7IQWD2LCWOcuOagM08U5sABNz78EPoPshBYLUfrcMocnZOVB/tc4OgRPQXm3ijV7FZwF2XE+4oVK0hISGDz5s15U/9FRUWRnJxM7969adq0KV27dqVjx464u7szfPhwe4UvhBCiHJs4EQ4fhkWLwN9f62jKBmdneOKFOFKSdDzzTNmYtSQjA159tTLVq8P4iTKDTUmp0yyNTpEWJk+GP//UOpqisWufjDuNeB86dChDhw695fvHjx+fN+WUEMJxxCVn4uFy64FRyZmmvJbw2+0nhBa2bPHk7bdh6FDo0kXraMqGuGR1TuqgsGxen2rm9fHOTJpmYsRLVsxWBdcKflqH+K9MmADnzzuzfTt4eGodTdml08G0t03s22Pg6X42vl5T+s8XWWlSAGrBI/1tywdFgZwcSEmBK1cgIUF9JCZCUhJkZt59S1Pu+ZOYlkVcciZxyZnojepcqdlma17XktxtuedZ7vtSMs15q/RJFxRRmpw+rbZYPvAAzJundTRlQ25OyJ2TutczOdRpnsqMN5zYvlPh/e2nMdkcrzzZuBHefRf69k3ikUe0jqbs8/K10vKZCxw6YGDunNJ/dSOjDgWgTtD//vbTDG8TLq2LDiorC2Jj4exZOHdOXQnv4kW1kL58WS2mk5MhLa1oBbWHB1SooN4+DwgAH38r/oE2qlXVUbemkdBQCAtTt+eeP4MiQvNmIhjQvGq+71dwlgJfd+d87xNCS7l3WW68wxIbb6JTZyMGg45Vq2RZ7pKi00HHoXFcjq3JsAGu9HzTcf4G5Z43ly8a6dPHmXvvhVGjLgOlv8W1LLgnIpXYI0kses+PTo+V7jtQUnCXY4qiFmcHDsDPh4xs2leFPQtcyLiutn5a/x6E7+oKPj7g7hlG1VAz1aor3NtIR8tmTlSqpO5zY5cAJ4MOs1WRrgEl5Pp1dVqyo0fVvmt//gknTsCFC+rvNJfBoK7oFhQEFStCvXrq77FCBbWYdnMDJyd1vyyzhSyTDcUKWdmQlakjO1NPTqaBpCS4ehUOHdRx8aIBc07+licfH6ge5oK1QgiWg87E2rwIrJadLxYhSruCjQ7Z2dCnp4FTp2DJsjRCQ320DrFMc/Ww0fO1WL6eXIuvp4UyIOI6VL3z+7SWkWNh3oYz/DD9HnQ6WLMGcnIk+dlT++fisSR60b+/E7/+CjVrah1R4aTgLkcUBf74A378EXbsgJgYtcVT5YyHjxe1wqByENStC4rOitmmYDHpyLxu4MJFPXt/0pOT8c8UTlWrQsuW0OgBhVi38/hUNOe1ckpr+X+Xmqpn82b49Vf1wujgQfUWdy4PD7WQbtkSateG8HB19a3q1dVC21DE2bbikk35WqhdgNFtwgnxdb9hn2ze23aa/g+Ec/GCjgvn9cSd03H6tI5TJ/UcOeLJnB1OQCgAX75iwzukBpcjnLnq6k1sZR2KgkyRJUo9iwX694ef9hjo8tJ5Wrf1vuM4BPHf+QabWPRZFtHd3Bg8wJud29UL+ly5DTulqVHHbIZ186px5i8dGzaod/3OXvTL66MuSp7RWWHBojR6RvrToaPC/77PIjhIl/f5l4bzBKTgLvOsVti9G/73P1i/Hs6fV1+vWRO6dYMGTSzUqmehRk0ry349w/Abiqy45Jy8Fh+ArGwTS/ZdIOu6gRZ+YcSdcmXXHitbtun48ksXoC7+VbK5+qSe7Mru2G5e7VnchsUCR47Avn3w00+wfz+cPFknb3t4ODRpAs8+C/feCw0bqhc8hawdVaxy/8iZrQo6HTi7Wdl2ORZcYdAgtUB//e9CvUfDUN75+jJXzrnikxXA7p/0LP/UCVNONdbNB1fPegTXzCJnvxPt20BInTv+eCHsymRS59letQomvmnCUj+VHGsFFsVIlzt7aNLURtTo86ybW53HHoNNm8Dv794ZBbuuaf37sFph1DBnTv3qzvQ5Jtq3V2Mx2fQslq5ydhVS1ca6dfDoY9Chg44NP1r4+kgsgObnSS4puMsgRYHNO82sXAHrvzFy9YoONzdo087G8FFmHnvcRmCQeuVntios3nWGOq6hee/PXX439+owt+9tbp9cNy8rzSNshERCjwE5vLftNG2Cwnj7k1ROH/Bi6SJPLJZwNr9no1cP6NkTmjcv+cLQ0aSkqMX1nj2wd69aYGeqHz1BQfDQQ9Cp02U6d67I/feDr2/x/NzCuv/criXmbvpZV/CGqvUyqVovkwHNPVi67wL9Hwrl7a8uUZOqfL0hk/gTbvzfHCPzZgO4E1C1Fmdb67nu7UNI3UwURT0Hc2PL/Qqlp6VClE0Wk47Bz7iwZRPMmQO9Blp4f7vWUZU/tZpeZ8GiNF4c4k27dvD991C5stZR5WexwODBsHa1kUf6JdB/oDcguUlLLVrA4s9yGNDHlef7WokYrsfVo/TMNSkFdxly9iwsXw6ffw6nTjlhdLYRfn8a02a70reHC8mmbN7ffhov/1De3x4LcFMRdePAtjsVWLm3zHQ6CK9lo2nnazTtfI0eDUOZ8kEy5lOVWbRIz4IFUCXERmRXK717Q6vmTnndCsrLdHC5/eX37FEfMTFq9x5FUbt9NG4MAweqCaN5c6hWTe16cezYNerVq1isseQW0EBeS9GtftfFcVvUyQkqhWbTM8LM9dCLAPRqHMqsz68QnFOFtZvMbFjvSVqqekG3+g0b/uHXeaqTCxddLvJK30p8vj8WUFsqCg5sE6I4JFzU8cXrYSScMvDBB+oUgHHJN+9XsEFClIwOT8AnX2QzeIAL9z2g8MlyE/c0Kh2feXo69O6tXgi8NNaMa7OrgLfWYQmgzaM2urx0nu8XVOPcxDB6TozVOqQ8UnA7uOvXYfVqWLoUdu4EnU7h4ZY2nh9pIcH3FC7uNp5oE06yqXj7k+UW5oUVahW8oX7LVIZPCsDbaGTpihz+b3EOiz/wYuG7OurWhainLDze2UxoTRuLd50BSs9tn+JgMqnLQP+wxci331Xl0xdcSUxQt3l5wcMPqy3/ERHw4INqX+zS5na/4//K0xNCG2UwKMKES9NYnn04lNkrE7j4lztuyZXYtsONmZOdgZp8/YZCYFgNqtbNpGYO/G4+y5jIGlJ4i2Kzezc81d2V1DQbHy3L4bm+hU9HcjcNEuK/ybEq/KE/yVfrw3i6lxNPdnRm8nQTSg1t4zp7Frp3V/P7hx9C515muQtSytR9OI2oh7IY3N+FZa+G06mmlZA2WkclBbdDslhg61ZYstTK+nV6sjJ1hNdUmDZNx6Ndsvn25Cm6RoTySYx6K6UkC6c78fKCrj2sxAecI+u6geCkcDasdWH2DAOzphupU89KYKOK1GmW6rCzWigKxMXBzz+rfa9/+kkd5JidDeBMhUBo08pG+7Z6WrSABg2KPpixvNDrIbBaDoHVchgU4c0nMbFE1qrB259fwzs1mE3b9Oz7JpC9q3VAfdbXtuIRkkrfLh50aAv33HPzZ1pe7p6Iois49V9WFox9xcoH7+qpFqrQZcJpOjwRonWY4gZ169sYMOsU6+ZX5fWxXtRoHMoTn9p/5LWiqHePR4xQ7z6uWwdPPJH/Lkju3Y/cNQiE/bi4OOe7IxvR2kr01DOsfqs6Tz7uyuzZ8OKL+Qft2/tvhBTcDsJmU/v7fv01fPWVOreyt7eeOhFJNGidwowhwVT1cycuWYGTWkf7jxv/A7h5WXm6i5WnB2QSdxFen5dCyh8Vifm6IjFfVWLz/9l4tL2Zjp2g02NOuLvf4ZtrQFEgPl6dLeS339THL7/ApUvqdmdnuO8+9Xb0ww9D9XpZrDl+6u/BqMX7362wZFFwFP+N2xxNxUoKdZunMSjCj+CYWEzZOpq4hrH4f2norwSw/6cKjNtmZBxqi/kDD0DTpurj/vvBycfCBzvUrjNl6e6J+Pdyu1MNeySc3VucGTsWTpww0KT9NZZ86MxXh3K0DlEUwt3bSq/XY3E9VYvpkz3o0ELHfZEVGdAUKKaxLbfz558wZoy6sE2rVmrhXb16/n1uvPtRcA0CUfJyrAqLYvKPNQoKy2bg3FP8+VVtRo0ysm4dvPee2kAD+btX2uNvhBTcpZjJpN7q/OYb+PZbdRETFxf1qrpvX2jUPIuP98YD6lVbaZuGqLCW9Rtfe+CJawya6cX/rY/j5C8VyDldic+XGliyWI+zs1qwtmypdrto2rT4Bg0WVUoKHDumJtvff1fnvT5yRF2dEdTPvG5dePRRdYBj06ZqX+wbF8eIS1bgeMnEV1iyKGwBmtxtN8424oicXRWaRVj5gysMivDg492xdKpWk4O/6Tn4m57DBwzMn6/DbFabMLx93PAOqUGlGllUSjTQ5mH19yWLl5RfigKxRz3o+Y4LP+2BOnXgi9XZHCUeT89QrcMTt6HTQ9+BZhIrxHJuUzgbvqpEy+0KI16AIUMgMLD4f+Yff6iriy5dql7Uv/MOjBwpdygdiZuXlU+Wm/hhlZEJE9QZvoYNg3HjADs36knBXYooCvx21MSWrbBnh5Gd2/Vcvw6ubgqt21p5dYqNNo9Z8PO9eWYJLbuN/FeevhaatE9iUEQFFm49R2OnmuzeYWD/HgPTp+vzVkWsFmqjfgOFmnVs3FNXR4O6RqpXh0qV1Jblu2GzqYu5JCaqLdZxcerqjGfPwpkzcPLkP4U1qIvE1K8PkZFqUd2kifrVsxStJnu7C67cbYt3nXHIc6QwOh1Urm5hw4VYgjvCxOmhLNp+jod9a7BoTQo+mYHs2qfnwEZ/flmvTpFjMCjUrq2jVl0bNcKt1Kxjo+E9eu5v5FSqfpfiv7vxDlDmdR1rv9Gz9GMX/vw9jMCKCh98AM89B4npNo5KH1yH4RNkZsxH2bzx0HnitoUyaZKB6TMUOnSy0bePgY4d725MTMFuRteuwdq18OWXatdNF1eFQc/bmP6mgYCAkjsuUXJ0OnVGmbYdTEyZpOf99w0sXAjdejnh2siVSjWy7RKHXQvuHTt2MHfuXEwmE3Xq1GHGjBl4Fvgrd6t9rFYrM2fOJCYmBqvVysCBA+nTp489wy92GRlw+LDaJWHvXnX2iosX1coxuLKNLt3MtGpn5YTxFE4uCu1vmFHCUYvrO3FyUWgWYeYP/Um+mxpO+nXUFswDetZtzeL4cU82/mBEseXvw+frqz5yV1F0dgajUb2IsVohObk6iqIOMk1JUR8FlzfX6yEkRF244MknoVYtdVGZevUgNLR0t2rc7oLLkS/G7pbRSaFhYxtN0tULuE9iYrFZoU1wGB+uuUZ1fTDHj+k4fEjP+rX5z6PgYHWu84CAYBo3/mcBoapV1fPibi/qygJHztmnzliZ/EESp37zIvZQBcwmHbXqWOk4LI4FE/2oGVwK+6yJIgupm8nk5zKZtSKBAxv92bPbj7Vr1LzftKl6Z7RhQzV/h4RAQIC6LZfZrC789tMhGx99d41KpiCOHFAXGLNa1Zw/bqKJ7PBTjI0KJcBXzhdH51bBQrWo02x+oQZjXs9hzdd+mJbVIrBaFta+BqK7qw1pJbU4m90K7qSkJCZMmMCKFSsIDQ3l7bffZs6cOUyZMqVI+6xcuZJz587x3XffkZGRQa9evahfvz6NGjWy1yH8K1ar2r83NhZOnVJbTvfvr8L58+q/cwcKVgmxcd+DNoY8bOWCaywv96jMkj2xtI0I5WyMY3YB+K+yzVY++zUWgOdHhGJocp5BEaEs3n6OTqHhxF3QceWSkfRkI4mJcPmqleRUBVOWHotFT1aWWkTr9eDmZqNiRbUYzy3OK1ZUH1WqqAm5cuXSXVQV7J/tqF1D7E1vgJq1bdwTkcqgCF8+iYnl/YhQFm07R1KCMw/5Vef0KR1x5wzEnTOwb58Ha9dy0yDe3HMlOFh9VKr0zzkUEKA+/PzUh6en46+o6Ug5OyVFHah89Cjs229l/086zp9zA0Lw8jMT/YwZap7ntWcqsWRPMq6ufsUeg9BGQNUc2v/t9pEwAAAMj0lEQVS/eIYsc2P/Xj0xOwzsjdEzf74+r3tZLjc3BaNRh82mkJGRu80VqIqrm0Lj+6y89DJE9zTQpAlcTLHw/nYrkH9tAHDcsTHl1Y13gKtWV3j8+Xg+WuDMa3PTOLrDlzkznJkzQ83nDz8M7durXZWKM4/breCOiYmhYcOGhIaGAtCnTx+ioqKYPHkyur+P6Hb7bNmyhZ49e2I0GvH29uaJJ55g3bp1JZK8TSZ1hgmLRb0KNpn+eS0nB7Ky1AVKMjLUFtO0NEhNVa+Wr11TuypcTLBxKQEuJ+qwWP75jen1CqE1PKhTz8KT3XVENDMQFKYOrAPoHRHKJzEmh/9jXZIMTgohNSxsuhjL8KfDARPwzyI+uStj3pgczZkZ1KjyT8tcYYu/ZFiMOGtccRe8velawS/fvL+5XULKS4t1STI6K1SsnkPbCBNnY2KZNVo9b8yZ16kcUIlz5+DPk2ZOnbFx+ZKe+ItwJdHApUt6Dh6Ey5fVC+rCGAzqktTe3updlzZt1P6fjsSRcnarVmqxDVAxSIdP9eu88qwLlyucJ7BaDs+1DOWTmCzJq2WY2WbloOU0I18JxSMmlmUPhTJvdQJXL7pwr38lNv+WSoOKfrg7OZGeY+GvpCRcPKx0b+3Db8lxjHoqmM/3x+ZbbTnXjXcJC46NEaXfre7yevtAk8eTaPJ4Ej3rh3N4nzs7dqg9DrZuhaeeUgvw4mK3gvvSpUsEBQXlPQ8KCiI9PZ2MjIy8W5S32ychIYHg4OB8244fL/7RaFeuqMuep6Xd/XtdXRV8fBV8/SAg0IZfret07eFJgzpOePhlE3P5HN6BZga1CmHpvgt5haHZWnID68q6wubFLSw5Do6olq+FIrd4zX1f7jLBBWf4KLjaYWEtHIXNDFJYK3Ru4Vzwe93YUpI76DE3FovehcU3LFIjSk7ueTM4ohpXMjNxD4R7/RT255zh+V7qOfLW3/9nAQw6HVeuKqSl6Em8DGnJOq4lQUqSjuxMA1npBlJT1Vzi5qbhgf1LjpKzAZYsUT/nBg3A5JTN+9vP//3/WmYdKa+cnMA/JAf/kByejvAju+ZlhrfxIsTXibhkM+9vvwxAuwgvYmNycJKZ/Mq1wIowYID6ALXLaXGvjq1TFPvMfrxw4ULi4+N58803AbBYLNSvX5+DBw/i/vf8b7fbp2vXrsyaNYvGjRsDsGrVKnbv3s2CBQtu+3MPHTqEi0xLIIRwQDk5OXk5z94kZwshxN25Xc62Wwt3cHAwhw8fznuemJiIt7d3XuK+0z7BwcFcuWHaiMTExHwtK7ei1R8rIYRwZJKzhRCi+BRzg/mtRUREcPjwYWJjYwFYuXIl7dq1K/I+7dq1Y/Xq1VgsFtLS0vj+++959NFH7RW+EEKUK5KzhRCi+NitSwnAzp07mTt3LmazmWrVqjFr1iwuXLjAxIkTWbt27S338fHxwWKxMGvWLPbu3YvZbKZXr14MGjTIXqELIUS5IzlbCCGKh10LbiGEEEIIIcobu3UpEUIIIYQQojySglsIIYQQQogSJAW3Bq5fv86QIUPo27cvvXr14uDBg1qHdFs2m41JkybRq1cv+vXrx7lz57QOqUjMZjNjx44lOjqa7t27s3XrVq1DumvXrl2jdevWnD59WutQimzRokX06tWLbt26sWrVKq3DKTKz2cyYMWPo3bs30dHRDvWZi5IlOdt+HD1vO2LOBsfM246Ws6Xg1sCnn35Ks2bNWL58OTNnzsybw7a02rJlCyaTia+++ooxY8bw1ltvaR1Skaxbtw4fHx++/PJLPv74Y6ZOnap1SHfFbDYzadIkXF1dtQ6lyPbv38/BgwdZsWIFy5Yt49KlS1qHVGQ7d+7EYrGwcuVKhg8fzvz587UOSZQSkrPtx5HztiPmbHDcvO1oOdtu83CLfwwYMCBvCXGr1VrqF3n47bffaNmyJaDOkfv7779rHFHRdOjQgccffxwARVEwGAwaR3R3Zs2aRe/evVm8eLHWoRRZTEwMtWvXZvjw4aSnpzNu3DitQyqyGjVqYLVasdlspKenYzRKehQqydn248h52xFzNjhu3na0nF26oysDVq1axWeffZbvtRkzZtCoUSOuXLnC2LFjefXVVzWKrmjS09PzlnIGMBgMWCyWUn9ye3h4AGr8I0eO5KWXXtI4oqJbs2YNfn5+tGzZ0qGSd3JyMvHx8SxcuJC4uDiGDh3Kxo0b0el0Wod2R+7u7ly8eJGOHTuSnJzMwoULtQ5JaEBytrYcNW87as4Gx83bjpazS///PgfXo0cPevTocdPrx48fZ/To0YwbN44HH3xQg8iKztPTk4yMjLznNpvNIRI3QEJCAsOHDyc6OprIyEitwymy1atXo9Pp2LdvH8eOHWP8+PF8+OGHBAYGah3abfn4+BAWFoazszNhYWG4uLiQlJSEv7+/1qHd0dKlS4mIiGDMmDEkJCTwzDPPsH79+lLfmimKl+Rs7Tli3nbUnA2Om7cdLWdLH24NnDp1ihdffJG5c+fSunVrrcO5o/vuu49du3YBcOjQIWrXrq1xREVz9epVBg4cyNixY+nevbvW4dyVL774guXLl7Ns2TLq1avHrFmzHCJx33///ezevRtFUUhMTCQrKwsfHx+twyqSChUq4OXlBYC3tzcWiwWr1apxVKI0kJxtP46atx01Z4Pj5m1Hy9my8I0Ghg4dyvHjx6lSpQqgtkZ8+OGHGkd1azabjSlTpnDixAkURWHGjBmEh4drHdYdTZs2jQ0bNhAWFpb32kcffeRwA1r69evHlClTHOIzB5g9ezb79+9HURRGjRqV15e0tMvIyODVV1/lypUrmM1m+vfv7zCta6JkSc62n7KQtx0tZ4Nj5m1Hy9lScAshhBBCCFGCpEuJEEIIIYQQJUgKbiGEEEIIIUqQFNxCCCGEEEKUICm4hRBCCCGEKEFScAshhBBCCFGCpOAW5VJ0dPQtVzDbsWMHDRo0IDk5+Zbvt1gs1KlTh/3795dUiEIIIf4mOVs4Oim4RbkUGRnJzp07ycnJuWnbDz/8QEREBL6+vhpEJoQQoiDJ2cLRScEtyqUOHTpgNpvZvXt3vtdNJhPbtm2jS5cuGkUmhBCiIMnZwtFJwS3KJV9fXyIiIti4cWO+13ft2oXNZqNt27akp6czYcIEmjdvToMGDejQoQNbtmwp9Pu1atWKNWvW5D3fu3cvderUyXseHx/PkCFDaNy4MW3atGHevHmYzeaSOTghhChjJGcLRycFtyi3OnfuzI4dOzCZTHmvbdiwgfbt2+Pq6sq0adM4d+4cn376Kd999x1NmjThtddey7d/UdhsNoYNG4a/vz+rV69m9uzZbN68mfnz5xf3IQkhRJklOVs4Mim4RbnVrl07rFYre/fuBSAnJ4dt27YRGRkJwAMPPMAbb7xB3bp1CQ0NZeDAgaSkpHDt2rW7+jl79uwhMTGRqVOnEh4eTtOmTXn99ddZvnw5Nput2I9LCCHKIsnZwpEZtQ5ACK24ubnRrl07Nm3axCOPPMLOnTvx8PCgWbNmAHTr1o0ff/yRlStXcubMGf744w8ArFbrXf2c06dPk5KSwv3335/3mqIoZGdnk5CQQJUqVYrvoIQQooySnC0cmRTcolyLjIxk3LhxWCwWfvjhBzp16oTBYABgzJgxHDlyhKioKKKjo/Hz8yM6OrrQ76PT6fI9t1gsef+2Wq2EhYXxwQcf3PS+wMDAYjwaIYQo2yRnC0clBbco11q0aIFer2ffvn3s3LmTZcuWAZCamsoPP/zAqlWraNSoEQBbt24F1JaOgpycnMjIyMh7fuHChbx/16hRg/j4ePz8/PDy8gLg559/5ssvv2T27NkldmxCCFHWSM4Wjkr6cItyzWg00rFjR+bOnUulSpVo0KABAK6urri5ufHjjz8SFxfHrl27mD59OkChA3AaNmzI6tWrOXnyJPv37+fzzz/P29aqVSuCgoJ4+eWX+euvvzhw4AATJ07EYDDg7OxsnwMVQogyQHK2cFRScItyLzIykmPHjuUNvAFwcXFh9uzZbNy4kSeeeIJZs2YxfPhwAgICOHbs2E3fY/To0Xh4eNC1a1emT5/Oiy++mLfNaDSyaNEiFEWhd+/eDBs2jGbNmjF16lS7HJ8QQpQlkrOFI9Iphd1rEUIIIYQQQhQLaeEWQgghhBCiBEnBLYQQQgghRAmSglsIIYQQQogSJAW3EEIIIYQQJUgKbiGEEEIIIUqQFNxCCCGEEEKUICm4hRBCCCGEKEFScAshhBBCCFGCpOAWQgghhBCiBP1/3jHyvLdNrWYAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 864x216 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = numpy.arange(-3, 9, 0.1)\n",
    "model1 = GeneralMixtureModel.from_samples(NormalDistribution, 2, X_imp.reshape(X_imp.shape[0], 1))\n",
    "model2 = GeneralMixtureModel.from_samples(NormalDistribution, 2, X.reshape(X.shape[0], 1))\n",
    "p1 = model1.probability(x.reshape(x.shape[0], 1))\n",
    "p2 = model2.probability(x.reshape(x.shape[0], 1))\n",
    "\n",
    "plt.figure(figsize=(12, 3))\n",
    "plt.subplot(121)\n",
    "plt.title(\"Mean Impute Missing Values\", fontsize=14)\n",
    "plt.hist(X_imp, bins=x, alpha=0.6, density=True)\n",
    "plt.plot(x, p1, color='b')\n",
    "plt.ylabel(\"Count\", fontsize=14); plt.yticks(fontsize=12)\n",
    "plt.xlabel(\"Value\", fontsize=14); plt.yticks(fontsize=12)\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.title(\"Ignore Missing Values\", fontsize=14)\n",
    "plt.hist(X[~numpy.isnan(X)], bins=x, alpha=0.6, density=True)\n",
    "plt.plot(x, p2, color='b')\n",
    "plt.ylabel(\"Count\", fontsize=14); plt.yticks(fontsize=12)\n",
    "plt.xlabel(\"Value\", fontsize=14); plt.yticks(fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When we impute the missing values, it seems that one component is fit properly and one has drastically increased variance. In contrast, when we ignore the missing values, we fit a model that represents the underlying data much more faithfully.\n",
    "\n",
    "At this point, you may think that as long as the data comes from a single distribution it shouldn't matter if you do a mean imputation of the data. However, this has the effect of shrinking the variance inappropriately. Let's take a look quickly at data drawn from a single Gaussian."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtUAAADkCAYAAABXCthKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdd1gUV9vA4R+9SVERUUBRNMQIVowauxiNImLUxPJqNLESSxJjwUqs2EtQY8O8MbZoohKNFWt4jSYaYy8JNlBBpKj0Bfb7w4+NKwsudQGf+7q4dGfOzDw77ByePXPmHD2lUqlECCGEEEIIkW/6ug5ACCGEEEKI0k6SaiGEEEIIIQpIkmohhBBCCCEKSJJqIYQQQgghCkiSaiGEEEIIIQpIkmohhBBCCCEKSJLqMsDV1RVXV1fCw8Ozrdu6dSuurq4sXbpUB5E9j+3UqVPFfty0tDS2bduW7+3zck4DAwPp27dvvo8FsHPnTlq3bl2gfWiyY8cO3NzcePbsWbZ1GRkZtGjRgo0bN75yP+PGjcPPz6/Q4xNCFI4BAwborJ7PKz8/P1xdXVm+fHm2dQkJCbi5uanqw4iICFxdXbl7926BjlkUf4sSExOpX78+W7Zs0bh+/vz5vP/++6/cz6lTp3B1dS3U2IRuSFJdRhgZGXH06NFsy0NCQtDT09NBRLr1yy+/sGrVqgLtQ9tz+sknn/DNN98U6FhdunRh9+7dBdqHJp06dUJPT48jR45kW/f7778TFxeHl5dXoR9XCCFyY2RkxLFjx7ItP3HiBOnp6arXVapUITQ0FEdHxwIdLzQ0FA8PjwLt42UWFha0b9+egwcPalx/8OBBunXrVqjHFCWbJNVlhIeHR7YEMCEhgfPnz/PWW2/pKCrdKYw5jbQ9pxYWFtjY2BToWKamplSoUKFA+9DEysqKNm3acOjQoWzr9u/fzzvvvEPFihUL/bhCCJGbRo0acePGDR4+fKi2PCQkhAYNGqheGxgYUKlSJQwMDAp0vEqVKmFsbFygfWjStWtX/vjjD2JjY9WW//XXXzx8+JAuXboU+jFFySVJdRnh6enJuXPn1G7znzhxAg8PDywsLNTKhoSE4OXlRf369Xn//fc5efKkal1CQgJTpkyhefPmuLm50alTJ7Vv4a6uruzevRtvb2/c3d3p06cP9+7d0ypGPz8/5s2bxxdffEH9+vXx8vLi+vXrLF26FA8PD7XkL+uW388//0zr1q3x8PBg5syZKBQKQHN3iazbn2fOnGHSpElERUXh6upKREQESqWSVatW0apVKxo3bszgwYO5c+dOoZzTF7t/KBQK/P39ad68OfXr1+fjjz/m1q1br1z34vs5c+YMrVu35ocffqB169Y0aNCAL7/8kpSUFNUxf/75Zzp06ED9+vX58ssvGTt2LIGBgRrfh7e3N6GhoSQmJqqWZWRkcOjQIby9vVXLduzYwXvvvYebmxtNmzZlxowZZGRkZNvf0qVLGTBggNqy1q1bs3PnTgAyMzNZsWIFLVu2pHHjxgwdOlTtM7Jv3z46d+6Mu7s7nTp1YteuXbn9GoQQ+RAaGoq3tzf16tVjyJAhzJo1S9WFKzAwkC+++IKZM2fSuHFjmjVrxpo1a1TbZmZmsn79ejp06EC9evXo378/169fV613dXVl2bJlNGvWjEGDBgFw9uxZevXqRb169fDy8nrlnTc7Ozvc3NzUGi7S0tIIDQ2lffv2qmUvd/84cOAAXbp0wd3dnY4dO/LTTz+pyua27sXuH+3bt2fTpk306dMHd3d3unXrxsWLF1Vlw8PDGTRoEPXr18fb25ugoCC1mF7UunVrLC0ts90N3LdvH02bNqVy5coA/PPPPwwePJiGDRvi7u5Ov379CAsLy7a/u3fvqv5uZXm5zv3999/p0aMH9erVo2vXrvz888+qdffv31cdp2nTpkyePJmkpCSNsYvCJ0l1GeHi4oKDg4NagnzkyBE6dOigVu769euMHz+eoUOHsmfPHj788ENGjRrFtWvXAAgICCAsLIwNGzawd+9emjRpwrRp00hLS1PtY8WKFUyePJmffvqJJ0+esGTJEq3j3LRpE40bNyY4OBhLS0sGDBhAXFwcP/zwAy1atGDatGlqrcwrV65kyZIlrFy5kpCQEJYtW/bKYzRs2JDJkydTqVIlQkNDqVKlCps2bSI4OJgFCxawfft2qlevzsCBA0lOTi7wOX3R5s2b+d///seaNWv4+eefsbCwYNKkSa9c97KYmBj27dvHunXrCAwMJCQkRJW0nj17lsmTJ/PJJ5+wc+dOzMzM2LdvX44xtW3bFiMjI06cOKFadvr0aVJTU3n33XeB54n8nDlzGDduHAcOHMDf358dO3Zo7DbyKhs3bmTv3r0sWrSI7du3U7VqVQYNGkRqaiqPHj1i/PjxDB48mAMHDjBkyBAmT578yi84QgjthYeH4+vrS6dOndi9ezfu7u5s3rxZrczhw4cxMDBg586dDBkyhCVLlvDPP/8Az+vdDRs2MGnSJHbt2oWjoyNDhgwhISFBtf2RI0fYsmULU6ZMITo6mmHDhuHt7c2ePXsYOXIks2fP1th97kWenp5qZc6cOYOLiwu2trYay8fExDBu3DgGDRrEgQMHGD58OFOnTiUsLCzXdZqsWLGCIUOG8PPPP2NlZcWsWbMASE9PZ/jw4VhYWPDTTz8xbNgwVqxYkeN7MDIyytb4pFQq1bp+ZGZmMmLECKpVq0ZwcDBbt24lLS2NhQsX5np+NImKimL48OH06NGDvXv3MmLECGbMmKGq32fMmIGJiQm7du1i/fr1nD17lrVr1+b5OCJ/JKkuQ9q3b6+qoBQKBaGhoXh6eqqVCQoKomfPnnTv3p1q1arRt29fvLy8+P777wFo3LgxM2bMoE6dOjg7O/PJJ5/w5MkToqKiVPsYOHAgzZs354033qBv375cunRJ6xjffPNN+vfvj7OzM15eXiQnJzNlyhRcXFzo378/8fHxxMXFqcqPGzcODw8PmjZtymeffcaPP/5IZmZmrscwNjbG0tISfX191W3D9evXM27cOJo3b46LiwvTpk3D0NAwx75weTmnL4qIiMDU1BRHR0eqV6/OV199xfjx41+57mXp6elMnjwZV1dXWrVqRatWrVTneevWrXTq1Il+/frh4uLCV199hb29fY4xmZiY0LFjRw4cOKBatm/fPtq3b4+5uTkAZmZmzJkzhw4dOuDo6EiXLl1wdXXl77//zvX8aLJ+/XomTJhAs2bNcHFxwd/fH6VSyeHDh4mMjCQ9PR17e3scHBz44IMP2LBhQ5F0fRHidbVjxw7q1q3LqFGjqFmzJp999hn169dXK2NpaYmfnx/Vq1dnyJAh2NjYcPnyZZRKJZs2bWLUqFF4enri4uLCrFmzMDQ0JDg4WLV97969qVmzJrVr12bz5s00bdqUgQMHUr16dbp06cKgQYP47rvvco3T09OT33//XXUXLSQkRPVFX5OoqCgUCgWVK1fGwcGBnj17smHDBmxtbXNdp0n37t3p0KEDNWrU4OOPP+by5cvA8waHBw8eEBAQQK1atfD29qZ///65vg9vb29Onz7N06dPATh37hxxcXF07NgRgKSkJHr37s2ECROoVq0abm5uvP/++6ovMXmxadMmWrZsSf/+/alWrRpdu3ZlwIABqgfO79+/j7W1NVWrVsXd3Z2VK1eq3ZEURctQ1wGIwuPp6cmnn35Keno6p0+fplatWtn6y4aFhXHz5k2122IKhYJ69eoBzyuakJAQduzYwa1bt7hy5QqAWiJbrVo11f/LlSun9lDJqzg5Oan+b2pqiq2tLSYmJgCqf19sFW/YsKHq/25ubsTHx/P48WOtjwfPn9COjIxk3Lhx6Ov/+z0yNTVVqy4grzqnL+rTpw/79++nVatWNGrUCE9PT3r27PnKdZrkdJ5v3LhBr169VOsMDQ1xc3PL9X14e3szcuRIUlJSMDAwICQkhAULFqjW16tXDzMzM5YvX05YWBg3btzg7t27tG3bNtf9vuzp06dER0fzxRdfqJ3rlJQU7ty5Q5cuXWjbti2DBw+mevXqtGvXjh49emBlZZWn4wghcnbjxo1sdUKDBg148uSJ6rWDg4NaP2ULCwsUCgUxMTHEx8erJeFGRka4ubmptfo6ODio/n/r1i1+/fVXtfo6PT39lV+Wa9eujb29PaGhoXTs2JGjR4+yefNmzp49q7F8nTp1aN++PcOGDaNatWqq+sPa2horK6sc12ny4t+icuXKkZmZSUZGBjdu3KBatWpqdVKDBg345ZdfcnwfHh4e2NracvToUbp3786BAwdo164d5cqVU+2/b9++7Ny5k8uXL3P79m2uXLlCpUqVcj0/moSFhXHy5Mls5zprX8OGDWPKlCkcOnSIFi1a0KlTJ+nXXYwkqS5DGjVqhIGBAefOnePIkSMav/FnZGQwePBgevToobY86wGOCRMm8Oeff+Lj40Pfvn2pVKkSvXv3VitrZGSk9jovDwW+/LDJi4nXq8pnJfb6+voaRzTJKbnP6he8ZMkSatWqpbbO0tIy1+Nrc05fVKtWLY4ePcrJkyc5fvw4q1evZvv27ezcuTPXdZrkdJ4NDAyynfNX/Q6aNWuGhYUFJ0+exMTEBH19fVq0aKFaf+LECUaNGsX7779Pq1atGDVqFNOmTdO4L03nPuscZ/0Oli9fTo0aNdTKWFlZoa+vz5o1a7h06RLHjh1T/RFdt24dzZs3z/U9CCG0o+mhvpfriJfrlyympqYal2dkZKg9Y5HVCALPr3svLy8+/fRTtW1eVb/D84aLY8eOUaVKFWxsbKhWrVqOSbWenh7ffPMNV65c4ejRoxw9epQtW7awevVqWrZsmeu6l2l6aFGpVOarftXT08PLy4sDBw7QrVs3Dhw4wFdffaVan5CQQM+ePalYsSLt27enW7du3Lx5U2NLfm71a9b/vb29GTFihFqZrHPt4+NDy5YtCQkJ4eTJk/j5+XHq1CnmzJmT63sQhUO6f5Qh+vr6tG3blqNHj3Ls2DGNfX9r1KhBeHg41atXV/0EBwdz+PBhEhIS2Lt3L4sXL+azzz7j3XffVbVsFMZoGvnx4sMxly9fxtbWlooVK2JkZKT24J1SqVR7sOPFisnKyoqKFSsSHR2tes+Ojo4sWbKEGzdu5Hp8bc7pi3bv3q26hTlnzhx2796tavnNbV1e1KpVS3WrEp5Xsll94nN7H126dOHo0aMcPnyYLl26YGj473fqH374gV69ejFz5kw++OAD1edE0+/95XOfkJCg6rJToUIFbGxs1M61g4MDixcv5ubNm/zzzz/Mnz8fd3d3xowZw+7du2nYsCEhISF5OgdCiJzVrl1brY4AVHcdX6VcuXJUqlSJCxcuqJYpFAquXLmS7Ytylho1anD37l21vyuhoaH8+OOPrzyep6cnJ06c4PDhw69stAgLC2PevHnUrVuX0aNHs2vXLjw8PDh8+HCu6/Kidu3ahIeHqz2grs258/b25tSpU5w+fRqFQkGbNm1U606fPs3jx4/ZuHEjQ4YMoXnz5jx48CDH+hVQq2NfnC9B07k+ceKEqnFm8eLFREdH07t3b1auXMmMGTNyfeZGFC5JqssYT09PduzYgY2NjdrtrSxZD3H897//5e7du2zdupXVq1dTvXp1jI2NMTMz49ChQ0RERBAaGsrMmTMB9S4ZxWnu3LlcunSJ3377ja+//pp+/fqhp6eHm5sbCQkJfPfdd4SHh7NgwQK1W5vm5uY8e/aM27dvk56ezqBBg1i+fDkhISHcvXuXGTNmcOrUKWrWrPnKGF51Tl/07Nkz5syZQ2hoKBEREfz000+Ym5vj7Oyc67q86N+/PwcPHmT79u3cvn2bgIAA7t+//8rxyL29vfn11185fvx4tj52NjY2nD9/nhs3bnDz5k0mTpxITEyMxt+7u7s7169f5+DBg9y+fZvp06erJeiDBg1i2bJlHDlyhLt37+Lv78+ZM2eoWbMmlpaWbNmyhVWrVhEeHs5vv/3GzZs3qVu3bp7OgRAiZx9++CGXL19m9erV3L59mzVr1nD27Fmt5yz45JNPWLFiBUeOHCEsLIzp06eTmppK165dNZbv168fV69eZfHixdy5c4cDBw6wcOFC1cgXuWnUqBGZmZls3rz5lUm1lZUV27ZtIzAwkPDwcE6fPq3q6pLburxo3rw5VatWZcqUKYSFhXHw4EGtJsh68803qVatGgsWLKBTp05qdwJsbGxISkoiJCSEiIgIfvjhB9XDii+rXLkydnZ2bNiwgfDwcHbu3Mmvv/6qWv+f//yHixcvsnTpUu7cucO+fftYvHgxVapUAZ6PMjJz5kyuXbvGrVu3OHToUJ7Pgcg/6f5RxrRo0YKMjIwcW1QbNGjAokWLWLFiBYsWLcLBwYG5c+eqvlUvXLiQ+fPns3nzZhwdHRkxYgSBgYFcvXqVN954ozjfCgBeXl6MGDGCjIwM+vTpg6+vLwDOzs5MnDiRNWvWsHz5cnr06KHWb6xZs2bUrFmTbt26sWXLFgYPHkxycjIzZszg6dOn1KlTh6CgIK0q/Ved0xf95z//ISoqikmTJhEfH0/t2rVZs2YN1tbWua7Li4YNG+Lv78/KlSuJi4ujU6dONGrUKMfbuVnc3d1VfQdfHAcW4LPPPsPPz4/evXtTrlw52rZtS58+fTS2gLds2ZKPPvqIKVOmYGhoyMcff0x0dLRq/dChQ0lJScHf359nz57x1ltvsX79elWfv6+//polS5awevVqrK2tGTBggFazjgkhtOPg4MDXX3/N/PnzWbFiBS1atKBDhw6vrCOyDBo0iISEBNU13KBBAzZu3JjjQ38ODg6sWbOGRYsW8e2331KpUiVGjx5Nv379XnksAwMD2rVrx++//06dOnVyLVupUiUCAwNZvHgx69atw9ramr59+9KrVy/09PRyXJcX+vr6BAYGMm3aNHx8fKhZsyY9e/ZUGz0pJ97e3ixZsoSpU6eqLffw8FCN0pGamsqbb76Jv78/U6ZMURsEIOv4c+fOZfbs2XTp0oXmzZvj6+urGoXKycmJNWvWsHjxYoKCgrCzs+OLL77gww8/BGDWrFnMnDmTgQMHolAoaNasWb5GGRH5o6fU1X19IXIRERGBp6cnhw4donr16roOp0S5ePEi5cqVU2tl9/Ly0thXXgjx+rl58ybp6elqk1QNGzYMd3d3Ro8ercPISr6YmBiuXr1Kq1atVMvWr1/PiRMnVKNkCZET6f4hRClz/vx5hg0bxp9//kl4eDirV6/m4cOHan8EhBCvr3v37jFo0CD+97//cf/+fXbs2MFvv/32yu4V4jlfX182b97M/fv3OXXqFN999x3vvfeersMSpUCxdv/YtGkTW7duRU9PDycnJ2bPnp1teLLjx4+zePFi0tLScHV1Ze7cuaphaYQQz7uYREREMHr0aJ49e0adOnVYt25dvoZnEkKUPR06dODvv/9mypQpxMTEUKNGDZYuXcqbb76p69BKvIoVK7Js2TKWL1/OvHnzsLW1pX///lp1ZRGi2Lp/XL58mTFjxqhm0ps/fz6JiYmqB+EAYmNj8fLyYuvWrTg7O7Nw4UISExPVhqYRQghRPLRp5Jg3bx4HDhxQPRtQo0YNrWY+FUKIsqbYun+4ublx8OBBLC0tSU1NJSoqChsbG7UyoaGhuLu7q0ZD6Nu3L3v27NHZcG5CCPG6io2NZdKkSQQGBnLw4EGcnJxYtGhRtnLnz59nyZIlBAcHExwcLAm1EOK1Vax9qo2MjAgJCaF169b88ccf2R6qioyMVJtu2d7enoSEBLXxGoUQQhQ9bRo50tLSuHr1Khs2bKBbt26MHj2aBw8e6ChiIYTQrWIfUq9Dhw506NCB7du3M3jwYA4fPqyaCejFqbBf9KpZmf7880+tx998UWZmplYzPpVEErtulNbYS2vcUPZj19PTyzbEYUmQWyNHVheQqKgomjVrxtixY6lRowZBQUF8+umn7Nq1K9c6+a+//lKbkU9bqamp+dquJJDYdUNi142yHntqaqrGervYkuq7d+8SHR2Nh4cHAD179sTf358nT55Qvnx5AKpUqaI2i1NUVBTW1taYm5vnum8zM7NXjm+pybVr1/K1XUkgsetGaY29tMYNZT/2V82GqSvaNHI4OTmxbt061evBgwezatUqIiIiXjlRUn6U5q6AErtuSOy6UdZjzynpLrakOjo6mrFjx7J7924qVKjAnj17qF27tiqhhueTSsyfP587d+7g7OzMtm3b8PT0LK4QhRBC/D9tGjmuX7/O9evX6d69u2qZUql85SQjJiYm0hBSikjsuiGx60ZBGkOK7Z5q1oxCH330ET4+Pvzyyy+sXLmSS5cu4ePjAzwfyiYgIIAxY8bQuXNn1XTJQgghilfLli25cOECd+7cAdDYyKGvr8+cOXMIDw8HYMuWLbi6uqp1GxFCiNdFsfap7tevX7axHp2cnAgODla9btOmjWrKbCGEELrxYiOHQqGgWrVqzJ8/n0uXLjF16lSCg4N54403mDp1Kr6+vmRkZGBvb8+SJUt0HboQQuhEsT+oKIQQonTQ1MhhY2Oj1hDi4+OjutsohBCvs9L5SL0QQgghhBAliLRUC5GDuKQ0ElPT1ZaZWlUo0mM+ffqUR48eoVAoCnW/CoWixI4y8SqlPfZ79+7h6OhYaocF1IWcroPS/ll4nWM3MjLCzs4OKyurQooqu6Kus1/ev4WJIeXNjQtt/6L0k6RaiBwkpqaz8liY2rJBTYruAaynT58SFRWFg4MDZmZm+Rp7PSfJycmYmZkV2v6KU2mOPTExkdjYWB4/foydnZ2uwykVcrsOSvNn4XWOXalUkpyczP379wGKLLEu6jr75f2PbOciSbVQI00nQpQQjx49wsHBAXNz80JNqIXu6OvrU7lyZZ48eaLrUEoNuQ7KHj09PczNzXFwcODRo0e6DkeIIiNJtRAlhEKhKLUtWSJnRkZGpKenv7qgAOQ6KMvMzMwKvWubECWJJNVClCDSMlf2yO807+SclU3yexVlnSTVQgghhBBCFJAk1UIIIYQQQhSQJNVCiBIvLS2NadOm0aRJE1q0aMG6detyLf/kyRPGjRvH22+/TatWrVi0aBEZGRka99u1a1dOnTqltvzevXuMGDGCJk2a0Lp1a+bNm0dqaio7d+7E1dVV48+DBw8K9T0L8bK8XgexsbF88cUXvP3227Rr147//ve/auvDwsIYNGgQDRs2pF27dqxfv15tfdZ11Lp162zX0d69e7NdA59++mmhvl8hShsZUk+IEk7T2Kt5lZmRiX5KklZlS+LYqwsWLOCvv/7i22+/JTIykgkTJlC1alW8vLw0lp8xYwbR0dFs2rSJ2NhYxo0bh42NDUOGDFGVSU1N5csvv+Tvv/9W2zYtLY0RI0ZQq1Yttm3bRkxMDJMnTwbg888/p1WrVqqymZmZjBgxAicnJ6pWrVoE71xkiUtK41lShtaf44IqC9fBqFGjSElJISgoiMTERPz8/NDT02PgwIEoFAqGDh1K06ZNmTFjBrdu3eLLL7/Ezs6Obt26Af9eRxs2bCAxMVHtOvr7779599138ff3Vx3PxMSkWM6DECWVJNVClHCaxl7Nq4z0dAwMtbvcS9rYq8nJyWzfvp3Vq1fj5uaGm5sbQ4YMYdOmTTkmEydOnGD+/Pm88cYbAHTt2pXTp0+rkup//vmHL7/8EqVSmW3bixcvcu/ePXbs2IGFhQUuLi589tlnzJs3Dz8/P0xNTVVlN23axMOHD7O1AIrCl5iazoqjf2v9OS6oknYdJCUl5ek6uHz5MufOnWP//v3UrFkTgPHjxxMQEMDAgQOJioqiXr16+Pv7Y2pqSvXq1XnnnXf4448/VEl11nVUq1YtzMzM1K6jsLAwXF1dqVSpUrGeh5ImIk79S15J/DImio90/xBCFIqLFy/y8ccf06xZs2y3he/evasqd+bMmRy7UOzcuTPbfm/cuEFaWhqNGzdWLWvcuDGXLl3S2KUDwMbGhp9//pnk5GSioqL49ddfqVu3rmr977//TtOmTfnhhx+ybVuzZk3Wrl2LhYWFapmenh5Pnz5VK5eQkMCKFSsYM2YM1tbW2p8oUabldB00aNCgQNfB9evX83QdhIeHY21trUqoAd58802io6OJiIjA0dGRZcuWYWpqilKp5Ny5c/zxxx80b95cVT636+iff/6hRo0ahXLOSqsURQYrj4Wp/RT0rqIo3aSlWghRYDdv3mTAgAF88MEHTJ48mZiYGMaNG0eVKlUYMGAA1apVU5Vt2LAhoaGhGvdjaWmZbdnjx4+xtrZWu7Vsa2uLQqEgJiZG40yF/v7+TJgwgUaNGpGZmUmzZs0YPXq0an2/fv1yfC8VKlTgnXfeUb3OzMxk06ZNassAfvjhB4yNjfnggw9y3Jd4veR2HfTu3btA10F0dHSergNbW1sSEhJISEigXLlyAKoZDePi4nB0dFSVbd26NY8ePaJdu3Z06tRJtTzrOmrRooXadZSWlkZ4eDjHjh1j+fLlKJVK3nvvPcaMGYOxsbTSiteXtFQLIQpszpw5tG7dmqlTp1K7dm2aNWvG+++/z5MnT+jWrZva+LTGxsZUqlRJ48+LXSuypKSkZPtDnfU6LS1NYzz37t3jrbfeYtOmTaxdu5b79+8zf/78fL23gIAArl27xrhx41TLlEolP/zwA/3798fIyChf+xVlT27XgZeXV4Gug+Tk5DxdB/Xr18fe3p6vvvqKhIQEoqKiWLFiBUC2CVhWrVrFqlWruHLlCgEBAarlWddRUFCQ2nV09+5d0tPTMTc3JzAwkAkTJrBnzx61bYV4HUlLtRCiQGJjY/njjz8ICgpSW25mZqZxsoezZ88ydOhQjfuaMWOGqj9nFmNj42xJQ9ZrTTPv3bt3j7lz53L06FHs7e2B5w9QffLJJwwfPhxbW1ut3pdSqWTOnDls3bqV5cuXU7t2bdW6K1eucO/ePXx8fLTalyj7ivo6MDExydN1YGxsTGBgIGPHjqVJkyZYWlry5ZdfcuHCBVXLdRZ3d3fg+RfYiRMnMmHCBCIjI1XXkbW1NWZmZlXQiKwAACAASURBVGrX0enTpylfvjzwvFuJUqnkyy+/ZMqUKRgWU793IUoa+eQLIQrkypUrZGRk4Orqqrb88uXLuLm5ZSvv5ubG7t27Ne6rYsWK2ZbZ2dnx9OlT0tLSVC1z0dHRGBsba+zLfPnyZSwtLVUJddYxMzIyePDggVZJdWZmJlOmTGHPnj0sXbqUDh06qK0/efIk9evXp3Llyq/cl3g9FPV1ULly5TxdBwB169bl4MGDPH78GCsrK+7du4e+vj5Vq1YlKiqKy5cv4+npqSrv4uKCQqEgISFB7TpKTk5WxZx1HdWrV0/tWFnbxsbGauySJcTrQLp/CCEKJDMzE3g+RF2Wu3fvEhoaqrElN2ukAU0/L7egAbi6umJkZMT58+dVy86dO0fdunU1tohlJeGPHj1SLQsLez56yov9SHMzb9489uzZQ2BgIB07dsy2/sKFCzRp0kSrfYnXQ1FfB3Xq1MnTdfDkyRP69u1LTEwMtra2GBsbc/ToUd566y3KlStHWFgYo0ePJiYmRrXNlStXqFChAhUqVMj1OoqIiOCdd95Razm/evUqVlZWr/1oIOL1Jkm1EKJA6tWrh5mZGQsXLiQsLIxff/2VYcOG4eXlRevWrQu8fzMzM7p3786MGTO4ePEiR44cYcOGDXz00UeqMvHx8Tx79gyABg0a8MYbbzBhwgSuX7/OX3/9xbRp0/Dx8aFChQqvPN5ff/3Fd999x5gxY3BzcyM6Olr1k+Xvv/+mVq1aBX5vouwoadeBtbU1KSkpzJs3j3v37rF//35WrlypmqClSZMmuLi44OfnR1hYGMeOHWPx4sWMGDECUL+Obt68qXYdNW/eHKVSyfTp07l9+zbHjx9nwYIFDB48WGNXFyFeF8Xa/SM4OJigoCD09PQwMzNjypQpqr5cWb7//ntWr16tukVrYWHBli1bijNMIUoUCxNDRrZzKdA+MjMy0TfQ7ju0hUneqoXy5cuzfPlyAgIC8PHxwc7Ojl69ejFs2LD8hKrRpEmT+Oqrrxg4cCAWFhaMHDmSLl26qNaPHj0aBwcH5s2bh6GhIWvXrmXu3LkMHDgQIyMj3nvvPbUHDXNz8OBBABYvXszixYvV1l25cgVDQ0MeP36MjY1Nob0/8WoWJoaMal9b689xYRwvL0radQCwdOlSpk+fTrdu3ahcuTKzZs1SdfcwMjJi7dq1zJgxgw8++AALCwsGDhyoStJfvI6GDRumdh2ZmpoSFBREQEAAPXr0oFy5cvTp04fhw4cX2nvNqxs34OQZA25esQI9JXp6oKcPDx30cXXSWVjiNaOn1DT7QRG4desWH330ETt37sTOzo4TJ07g7+/P8ePH1cqNHTuWdu3a4e3trfW+r127Rp06dfIcU363Kwkk9qIXEZeUbdKVQU3scXUqmtubRXlekpOTNT7MVBqUhdhz+92WluuhMOX3fJSFz0JpVJixF9bnXamEixfhp5+e/1y9mnPZ5s2hd2/o1QscHPJ/zJf/Jgxu6UxQ6B21MiPbueBY3jz/B3lBaa4bynrsOZUptpZqY2NjZs+erXqAwc3NjcePH6s9dAFw/vx5EhMTCQoKomLFikyYMCHbgx9CCCGEeP0olc+T6MmT4e+/QV8fWrWCr7+GWu7J7DgXgVIJKCEjXZ+K8fYcO2jB55/D558/LztvHrw07LwQhaLYkmpHR0fVQ0JKpZKAgADat2+vllAnJSVRs2ZNhg8fTqNGjdi3bx9Dhw5l//79arObvSw1NZVr167lOaaUlJR8bVcSSOxFT7+cLfHxcWrLMjPtiix2hUKhesq+sCmVyiLbd1ErC7ErFIpS8ZkXoiR78AA+/RSCg6FBA1izBrp3h6zBRiLilJyMTVHbZlCTJJbOt+DGDdi+Hdatg5YtYcwYmDMHckkthMizYh9SLykpCT8/PyIjI1m/fr3aOnNzc7UxPrt06cI333zDpUuXaNasWY77NDExke4fpUhpiT0iLgkbm/Jqy/T19XEtotivXbtWZLeH5dazbmTFbmRklGt3ByFEzjIzYf16GD8e0tJgwQL44gvIy3DYrq4wbdrz1upJk2D5ctiz5/l+27UrutjF66VYR/948OABffr0wcDAgI0bN2JlZaW2/v79+3z//fdqy5RKpQwkL4QQQrwm4pLSiIhLIiIuiSt3kmjTPoPhw6FxY7h06Xlynd+0wNISVqyAEyeedx1p3x5GjYL09MJ9D+L1VGxJdXx8PP3796djx44sXbpU4zSsZmZmLFu2jIsXLwJw4sQJkpOTsw0yL0RZVUzPDYtiVJp/p8ePH8fb25tOnToxZswYEhISciwbEhJCo0aNCuW4pfmciZxp+3tNTE1n5bEwFuy+Q/v2epz6nx7zlqRy5AgU1kiWrVvDhQvPW65XroQPP4QXhhgXIl+KLaneunUrDx8+5PDhw/j4+Kh+oqKiVP9WqFCBZcuWMX36dLy8vFi1ahUrV65U63ctRFllZGRUavsOi5wpFIpSebctNjaWSZMmERgYyMGDB3FycmLRokUay965c4f58+cXSjIs10HZlZycjJGRkVZlnz42YvPUmsTeN6GX313+MyiDwh4C29wcli593hVk167n/bOTkgr3GOL1Umw1va+vL76+vhrXBQcHq/7fqlUrWrVqVVxhCVFi2NnZcf/+fRwcHDAzM5NJFMqAzMxMHj9+nOM00iVZaGgo7u7uODs7A9C3b198fHzw9/dX+2wmJyczfvx4/Pz8tB4LPDdyHZQ9WQ/s3r9/n8qVK7+y/O1bemyaWpPURAN6T7uN01tJwKu3y68xY54/sDh0KHTp8ryvtaVlkR1OlGGlr/lEiDIq6xmDBw8eoFAoCnXfCoVC6xaikqa0x25jY6OazKo0iYyMxN7eXvXa3t6ehIQEEhMT1abRnj59Or17987T0KevGrEpIyODsLCwbC3fSqWy1CbZr3vsenp66Onpcf/+fe7fv69abmpVgbTMf2+a37xhwOD/2JCWnEHXcRewrJpAfDwkJiRyLfJujtsB6BsaaTVi08vbGutn8s47sSxYYIWfX1VatkxhzZp7WFtnqu//pRGhMjKcsh3v5TgLorSMlKXJ6xq7JNVClCBWVlbZHuAtDKVlxBVNSnvs1apV03UY+ZKZmalxub7+v8nI5s2bMTQ0pFevXkRERGi9bxmxqXQpytgj4pJY+/8TqjyLNeS7ibWwMIb+s29j62QEPB+ByaKcBY4vTLz14nZZBrd01mrEppe3HdnOhRoOlalTB2rXhg8/NOOLL1w5fhxMTNS3e3H/BgYG2Y73cpwFIZ8Z3dB28hdNinX0DyGEEKVDlSpViI6OVr2OiorC2toac/N/Z4vbtWsXly5dwsfHh2HDhpGSkqJ6RkaIvFCk6rFzQXVSk/RZtyUZWyfdPDXo4wNbtsDp0zBixPPJZoTQliTVQgghsmnZsiUXLlzgzp07AGzbtg1PT0+1Mj/++CN79+4lODiYtWvXYmpqSnBwsFb9ZoXIolTCgdUOPPzbnK5jIqhTV/NdkuLSsyf4+8N//wvLluk0FFHKSFIthBAim4oVKxIQEMCYMWPo3LkzN2/eZOLEiaqWaSEKy+ldlbhysjyt+0bi2vSprsMBYPp0eP99GDcODh3SdTSitJA+1UIIITRq06YNbdq0UVtmY2OjNmJTFkdHR86fP19coYlSKi4pjcTUf2da2f+LPie2VKZOi3ia94zOZcvipa8PGzfCO+9A795w5gyYF05XaVGGSVIthBBCiGKRNbELwONwE7ZOqY19zWS6jIwo9HGoC6pcOfj5Z2jSBLp1g50HdR2RKOmk+4cQQgghilWGQo+flzthYqqk58S7GJmUzCcCnZ3hxx/hn39g2gSZiE7kTpJqIYQQQhSr0O12PLptxtwlKVhWTH/1BjrUpg1MnQo7txty/bfCH/JUlB2SVAshhBCi2IRfM+f07krU84zF870MXYejUVxSGhFxSaqfgZ8m4d4ggwOrHUiIk56zQjP5ZAghhBCiWCQ8g71fO2Flq8Dz44dAyZwc6cW+31kWrqhJ1/Zm7FvpyAdT7ugmMFGiSUu1EEIIIYrFjCnGPH1shPdn4ZiY6XY86rxyqZ1J2wGR3DpvyV+HK+g6HFECSVIthBBCiCK3ezds22RIs+7ROL6ZpOtw8qXxezE413vG0f9W4e7tEjZcidA5SaqFEEIIUaRiYmDYMKjrnknLDx/lax8v9nFWZOhmtBA9fegyKgJ9QyXjR5mRqaFL+ItxRsQlEZeUVvyBCp2QPtVCCCGEKFITJ0JsLGzemcrRR3lPiFMUGQSF3lG9HtzSufCCyyOrium8O/gBe792otLhCjR6L1a17uU4AUa2c6G8uQzH9zqQlmohhBBCFJnQUAgKgrFjoU7dkjkedV7VbR3PO63SObHZXkYDESqSVAshhBCiSCgU4OsLTk4wfbquoyk8enrgPy+F9DQ9jm2013U4ooSQpFoIIYQQRWLZMrh8GQIDn0/7XZbUrKWkaffHXDlZnjuXLHQdjigBijWpDg4Oplu3bvj4+NCnTx8uXbqUrcyFCxfo0aMHnTt3ZuDAgTx6lL8HGoQQQgihO3fvwldfQbdu4OOj62iKRvMej7CpnMqhtVXJUMhoIK+7Ykuqb926xcKFC1m/fj3BwcH4+voyevRotTJpaWmMGTOGKVOmsH//fjp16sSUKVOKK0QhhBBCFJLPPnv+79df6zaOomRkoqTj0AfEPjDlzM+2ug5H6FixJdXGxsbMnj0bOzs7ANzc3Hj8+DFpaf8ONXPp0iXKlStH48aNAejVqxe//fYbcXFxxRWmEEIIIQooOPj5j78/VK+u62iKVs2GCbg2f8KpH+0Ivyut1a+zYntk1dHREUdHRwCUSiUBAQG0b98eY+N/h5mJjIzE3v7fDv/GxsZUqFCBqKgoypcvn+O+U1NTuXbtWp5jSklJydd2JYHEXvT0y9kSH6/+hS4z065UxP6y0nLONZHYhShdUlLg88+hbl344gtdR1M8Onz8gNvn32D2VFPeHq7raISuFPs4MElJSfj5+REZGcn69evV1mVmap6y1MDAINd9mpiYUKdOnTzHcu3atXxtVxJI7EUvIi4JGxv1L3P6+vq4loLYX1ZazrkmZT12SbpFWbNsGdy5AyEhYGSk62i0ExGnPsNjXieXsayYzjsfPOLo91Wwa2aBc/3EHMvGJaWRmJqutszCxFDGsi4DijWpfvDgASNGjMDFxYWNGzdiamqqtr5KlSpER0erXisUCuLi4qhcuXJxhimEEEKIfIiKgrlzwdsbPD11HY12NE3Ykp/JZTy8YvjnRGWO/LcKHy/6B/0c2gMTU9NZeSxMbZlMEFM2FFuf6vj4ePr370/Hjh1ZunRptoQaoH79+sTHx/Pnn38C8NNPP9GgQQOsrKyKK0whhBBC5NO0aZCcDIsW6TqS4mdopGTC9FSi75lx8UjOXVZF2VVsLdVbt27l4cOHHD58mMOHD6uWr127lmHDhrF27VoqV67MihUrmDlzJsnJydjY2DB//vziClEIIYQQ+XThAqxf/3zUjzfe0HU0uvFe13Qc6yRycltl6rR8gom55m6tomwqtqTa19cXX19fjeuCg4NV/69Xrx4//vhjcYUlhBBCiAJSKp9PQ16+fNmaOTGv9PTAc9BDvptYi99+qkTbAVGAep/tvPbXFqWHTFgvhBBCiALZsweOHn0+c2Iug3W9FqrUSsatbRx/7LWlQcfYbH2289NfW5QOMk25EEIIIfItLQ2+/BLefBOGy3ByALTpF4m+ARz7voquQxHFSJJqIYQQGh0/fhxvb286derEmDFjSEhIyFZm06ZNeHl50bVrV3x9fYmJidFBpEKXvvkG/vkHliwpPUPoFTXLiuk07R7Njd+sOXsm92GBRdkhSbUQQohsYmNjmTRpEoGBgRw8eBAnJycWvTSkw+XLl9mwYQPbtm1j7969ODs7s3z5ch1FLHThyROYNev58HmdO+s6mpKlqU805SoomD/DBKV0o34tFEpSHRsbWxi7EUIIUQy0qbNDQ0Nxd3fH2dkZgL59+7Jnzx6UL2QHbm5uHDx4EEtLS1JTU4mKisLGxqaowhYl0IIFEBMDMlBXdkYmSlr1juKvcwbc/D3vQwObWlUgIi5J9ROXlFYEUYrCpHVSXadOHY0VcUREBJ6lZYR3IYR4TRS0zo6MjMTe3l712t7enoSEBBIT1WeKMzIyIiQkhNatW/PHH3/Qo0ePggcvSoUHD2DpUujbFxo31nU0JZN7uzhc3sjgxKbKZGbkbdu0TH1WHgtT/bw8C6MoeXId/WPXrl2q4e2USiW+vr4YGqpvEh0djZ2dXdFFKIQQQiuFWWdnZmoeX1dfP3tbTIcOHejQoQPbt29n8ODBHD58WGO5LKmpqfmanj0lJaXUTuteFmP397dHobBh0KAwrl1TaLUv/XK2xMfHqV5nZDipvdZ2mbbbZWbaZYu9uGMY65fMyE/KcXqvCW+1idRYJjEhkWuRd9WWYV5BrZzGMiVUWfy8ayPXpLpTp07cv38fgHPnztGoUSMsLCzUylhYWNCxY8d8HVwIIUThKcw6u0qVKly4cEH1OioqCmtra8zNzVXL7t69S3R0NB4eHgD07NkTf39/njx5QvlcxlUzMTGhTp06eXpvANeuXcvXdiVBWYv9+nX46ScYNQo6dqyl9b4i4pKwsfn3s2FgYKD2Wttl2m6nr6+P60uxF3cM77ZQ4uCayJ97atDkvTSNZSzKWeDoVElt2Y3waLVymsqUVGXt866pjCa5JtXm5uaMGjUKAAcHB7p06YKJiUk+wxRCCFGUCrPObtmyJfPnz+fOnTs4Ozuzbdu2bN1GoqOjGTt2LLt376ZChQrs2bOH2rVr55pQi5ItLiktWzcDU6sK2cqNm5CJubken4xKJiIOLEwMKW9uXFxhlip6etDuo0g2TXHhj722jJAes2WW1pO/vP/++4SFhXH58mXS09PVHlYB6NWrV6EHJ4QQIn8KWmdXrFiRgIAAxowZg0KhoFq1asyfP59Lly4xdepUgoOD8fDwYMSIEXz00UcYGBhgZ2fHypUri/JtiSKWmJrOymNhassGNbFXe33qFPyyR59WfSPZdikagJHtXCSpzoXjm0nUbvKEM7srETs1WdfhiCKidVK9du1alixZgrW1dbbbiXp6epJUCyFECVIYdXabNm1o06aN2jIbGxuCg4NVr/v160e/fv0KJ2hR4imVMHEi2FVW0qTrY12HU6q0+U8UQWOtWL3cmMrSa7ZM0jqp/vbbbxk/fjyDBw8uyniEEEIUAqmzRVH45RcIDYW5ixU8NZXBl/PC1ikV93ZxbPq2PEMaGGFtp93DnaL00HpIPYVCIQ8kCiFEKSF1tigsJibGRMQlcS8mifETM3GumUnPvtkTwhfHVI6ISyLqaXK2ZYqM1zsRb9k7Cj09CN0uo6aVRVon1T4+PmzevDlbvzwhhBAlj9TZorCkZihZeSyMUbNiuH5Vn3o+EegbqA+5mKLIUBtTeeWxMJ6lpGdblpHDUI2vC6uK6Qz4RMHlE+V5HC4DP5Q1Wnf/iIuL49ChQ+zZswcHBweMjIzU1m/evLnQgxNCCJE/UmeLwpSh0OPk1srY1UimzjtPABnhJb+Gj0ll03cGnNxamR4T7uk6HFGItE6qa9asyYgRI4oyFiGEEIVE6mxRmC4cKc+TR8Z8MOU2elrf4xaalK8Ab3d7zK/bKvPgbzOq1pbRQMoKrZPqrLFPhRBClHxSZ4vCkpQE/9thh2OdRGo2TNB1OGWCR9fHnNtXkROb7en71W1dhyMKidZJ9YQJE3Jdv2DBggIHI4QQonBInS0Ky/dBJiTGG/H++Hvo6ek6mrLBxCyTd3o9ImRDVe5csIB2uo5IFAatb+IYGBio/SiVSu7du8fBgwext7d/9Q7+n1KpxM/Pj6CgII3r582bR9u2bfHx8cHHx4fPP/9c630LIYR4rrDqbPF6S35mwPqVprg0forjm0m6DqdMadAxFqtKaRzfbI88T1w2aN1SHRAQoHH5t99+y9WrV7XaR1hYGDNmzODChQvUrl1bY5nz58+zZMkSGjVqpG1oQgghXlIYdbYQZ3bbkvAMPugXpetQyhxDIyUtP4xi30on9u9JZdhAXUckCqrAjxu8++67hISEaFV28+bN9OjRg86dO2tcn5aWxtWrV9mwYQPdunVj9OjRPHjwoKAhCiGE+H95qbPF6+1ZrCFn99ni1V2BnXOKrsMpk9zaxGPrmMKCOUakp+s6GlFQWrdUZ2oYWzIxMZFt27ZRvrx2Q+tMnz4dgNOnT2tcHxUVRbNmzRg7diw1atQgKCiITz/9lF27dqGXS0eu1NRUrl27plUML0pJScnXdiWBxF709MvZEh8fp7YsM9OuVMT+stJyzjWR2POnMOps8Xo7tcOOzAw9PpuQwhFp3yoS+gbQql8UuxZUZ+NG+OQTXUckCkLrpPqtt97SmNiamJgwe/bsQgnGycmJdevWqV4PHjyYVatWERERgZOTU47bmZiYUKdOnTwf79q1a/nariSQ2IteRFwSNjbqyYe+vj6upSD2l5WWc65JWY+9qJLu4qizRdkV+8CYv0Iq0LBjLE7VDUCS6iLzxttPadAoA39/A/r1A1NTXUck8kvrpHrjxo1qr/X09DAyMqJWrVqUK1euUIK5fv06169fp3v37qplSqUy26QFQgghclccdbYou37dVhlDIyXv9HoEVNF1OGWanh5M8lfQ28eAVatg7FhdRyTyS+s+1W+//TZvv/02FStWJD4+nsePH2NqalqolbO+vj5z5swhPDwcgC1btuDq6ipPqgshRB4VR50tyqao26Zc+58NHl6PKVdeOvoWh3daZdKxI8ydC0+f6joakV9at1Q/efKEiRMncvz4caytrcnIyCAxMREPDw9WrVqFpaVlvgK4dOkSU6dOJTg4mDfeeIOpU6fi6+tLRkYG9vb2LFmyJF/7FUKI11lR1dmi7Dux2R7Tcuk07R6t61BeK3PngocHLF4MM2boOhqRH1q3VM+aNYvo6Gj27dvHmTNnOHv2LHv27CE5OTnHoZtyMm/ePAYPHgyAu7s7wcHBqnU+Pj7s3buX/fv38+2331K1atU87VsIIUTh1tni9XH6lD63zlvS/P1oTC2yP+wqik7jxvDBB8+T6kePdB2NyA+tk+pjx44xY8YMatasqVpWq1Ytpk+fzpEjR4okOCGEEPkjdbbIK6US5s80olwFBY06x+g6nNfSrFmQkgJz5ug6EpEfWifVpjk8jqqnp0dGRkahBSSEEKLgpM4WebV3L5z93YCWH0RhZCJT/OmCq+vzYfVWr4aI8AJPJSKKmda/sfbt2zNz5kxu376tWnbr1i1mzZpFu3Yyab0QQpQkUmcLbcQlpRERl8Sd6CTGjc/EuWYm7u3jXr1hKWFiYkxEXJLajyKjZH9hmD4d9PUhcLGFrkMReaT1g4rjx49n5MiRdO7cWfX0eGJiIm3atGHatGlFFqAQQoi8kzpbaCMxNZ2Vx8K4cKQ8N284EhiUzH2tM4OSLzVDyZrQMLVlg1s66yYYLTk6wmefwYIFJlRoYUplmc2y1NDq0rl48SKurq58//333Lhxg7CwMNLS0nB0dMTDw6OoYxRCCJEHUmeLvFCk6hG6rTJVayfRySuDDf/TdUTCzw9Wr1Fy/Ht7ek+7o+twhJZy7f6Rnp7O+PHj6d27NxcuXADA1dWVLl26cOLECQYMGMDUqVOlf54QQpQAUmeL/Dj7iy3PYo1oO+AhGibhFDpgYwMjRidx+y9L7lyQbiClRa5J9YYNGzhz5gwbN27k7bffVlu3dOlSvv32W44cOcL3339fpEEKIYR4NamzRV7FxcLpXZVwafyUanWTdB2OeMF/PkrGqlIax76vglJGNywVck2qd+3axbRp02jSpInG9c2aNWPChAn8+OOPRRKcEEII7UmdLfLq68VGpKXo07Z/pK5DES8xNoHWfaOIum3G1f9Z6zocoYVck+qHDx/y1ltv5boDDw8PIiIiCjUoIYQQeVfYdfbx48fx9vamU6dOjBkzhoSEhGxlgoOD6datGz4+PvTp04dLly7lK3ZR/O7cgY1Bhri3jaNStVRdhyM0qNsqHrsayZzcYk+q/IpKvFyTaltb21dWvg8ePKB8+fKFGpQQQoi8K8w6OzY2lkmTJhEYGMjBgwdxcnJi0aJFamVu3brFwoULWb9+PcHBwfj6+jJ69OgCvQdRfKZOBT19aNknStehiBzo6UO7/pE8eWTM9xvK0LAsZVSuSfW7775LYGAgCoVC43qFQsGKFSto3bp1kQQnhBBCe4VZZ4eGhuLu7o6zszMAffv2Zc+ePSiV/47xa2xszOzZs7GzswPAzc2Nx48fk5aWVvA3I4rUn3/C5s0weHg6VhXTdR2OyEWNBgk413vG8kVGxMfrOhqRm1y/9nz66af06tWLHj16MGDAANzc3LC0tOTJkydcvHiRzZs3k5qaypIlS4orXiGEEDkozDo7MjISe3t71Wt7e3sSEhJITExUjXvt6OiIo6MjAEqlkoCAANq3b4+xsXGu+05NTeXatWt5fn8pKSn52q4kKAmxm1pVIC1TH6UShn9qTfkKhnwyIon1p/6d7CUjw4n4+Jcmf1FmX/ZyOU3babOsqLcrLbGnKxTcCI9WW6ZnaKgq59E9jZ9mNWLs2BjGj39ESVcSPu/5VZDYc02qLS0t2b59OwsXLmTevHkkJycDzytPa2trunbtysiRI6lQoUK+Di6EEKLwFGadnZmpebgBff3sNziTkpLw8/MjMjKS9evXv3LfJiYm1KlT55XlXnbt2rV8bVcSlITYI+KSWHssjBunrTh7phIdh97HuoIVNjb/dgcyMDBQew2AHtmWvVxO03baLCvq7UpL7Ono898/1B8WHdTcSVXOxgY+7JfBjVQoJwAAIABJREFUpk0VmTy5IrVqUaKVhM97fmkTe05J9ys76FhbWzN79mymT59OeHg4T58+pXz58lSrVk1j5SqEEEJ3CqvOrlKlimqsa4CoqCisra0xNzdXK/fgwQNGjBiBi4sLGzduxNTUtNDeiyh86Qo9jm20x9YphQbvxgJWug5JaGn8lDT27jZkwgTYuVPX0QhNtK5hjY2NcXFxoWHDhjg7O0tCLYQQJVhB6+yWLVty4cIF7ty5A8C2bdvw9PRUKxMfH0///v3p2LEjS5culYS6FDi3ryLxUSa0H/gQfQNdRyPyorI9TJoEu3bB8eO6jkZoIpmxEEKIbCpWrEhAQABjxoyhc+fO3Lx5k4kTJ3Lp0iV8fHwA2Lp1Kw8fPuTw4cP4+PiofuLi4l6xd6ELMY/h1I921Gz4jJoNsw+PKEq+sWOhWjX44guQiVFLHhmfRQghhEZt2rShTZs2astsbGwIDg4GwNfXF19fX12EJvJh8bznE720H/RQ16GIfDIzg/nzoW9f+O47+OQTXUckXiQt1UIIIUQZd+UKbP6vIQ07xmLrKLOIlGa9e0Pz5jBlCjx7putoxIuKPalWKpX4+fkRFBSkcb02M3gJIYQQQjtK5fNuA+XKQcveMtFLaaenB0uXQmQkzJun62jEi4o1qQ4LC2PgwIHs379f43ptZvASQgghhPZ274ZDh+CLiQrMraQjblnQtCn07w+LF0NYmK6jEVmKNanevHkzPXr0oHPnzhrXazODlxBCCPE6i0tKIyIuSfUTl5TzDJaJifD55+DuDoOGysyJZcn8+WBkrGToiAzCY7X7PIiiVawPKk6fPh2A06dPa1yvzQxemsjsXKVLaYldv5xttlmvMjPtSkXsLyst51wTiV0IdYmp6aw89m/z5Mh2LpQ31zyL5dy5cO8enDwJhjI0QZlStSqMnahg5lRjPpsfjWvTp0DunwdRtErUJZaXGbxeJLNzlS6lJfaIuKRss17p6+vjWgpif1lpOeealPXYJekWReXmTVi4ED76CFq1gggZ6bDM+XhYOt+szeDIhirUqP8MY1O5s69LJWr0jypVqhAdHa16ndMMXkIIIYTImVIJo0c/H4JtwQJdRyOKiqEhdBz6gKePjfntJztdh/PaK1FJtTYzeAkhhBAid99tUXDoEIybnIbC+HlfW0WGtGKWRU5vJeHWNo4zP9sSE2Gi63BeazpPql+cnSunGbyEEEIIoZ2EBJg8wQC7Gskk1LzBymNhrDwWRkYOXSxF6dduQCRGxkoOra+KjO2gOzrpUz3vhYEV3d3dVbNzgeYZvIQQQgihnRkz4OEDffrPeYC+ga6jEcXBwiad1n2jOBxUlT27Uvl0sK4jej3pvKVaCCGEEIXjjz9gyRLo91E6jm8m6TocUYwadoqhcs1k/CcZExOj62heT5JUCyGEEGVAWhoMHgxVqsCUmTJW8etG3wC6jIwgPg6GfZpebONWvzxuekRcEqZWFYr0mCVViRpSTwghhBD5ExAAly7Bnj1gZaXraIQuVHZOYfiYNFYuMUG/VgS1Gj8r8nGrXx43HWBQE/scSpdt0lIthBBClHKXL8OcOdCv3/+1d+dxUdX748dfM8MOBi4gqCDuqWmm2bVExTS3VLTs5pZa1u+q3dSruZVpZa6JWeaWmlpuXa83tdLcl9S0WypZ6tfEJQgFVERZh5k5vz8+CSJgIDiHGd7Px+M8hnPmnJn32Olz3udzPgt07ap3NEJPQ0eaqVQtg22LqpKRKmmePcm/thBCCOHArFbV7MPXFz78UO9ohN7c3VUzkJTrLuz9vGzWGOtFkmohhBDCgS1d6MIPP8C8eVCpkt7RiNKgSt10mne9wvEdFTm4X1I9e5F/aSGEEMJBXYtzY/Z0V7p3h+ef1zsaUZq06h1P+cBMxo5wIzVV72jKBkmqhRBCCAdkzTKweW4wHh6wcCEYDHpHJEoTV3eNzsNiifndwL/+pXc0ZYMk1UIIIYQD+m5dAJejvZj1oZkqVfSORpRGIQ3TGDbCwpIl8J//6B2N85OkWgghhHAwF054c3iTP02eukrnrla9wxGl2OgJWTRvDq+8AjExekfj3CSpFkIIIRxI0jX4+qNgKlbJ5MlBl/QOR5Ryrq6wZg1kZUH//mq0GHF/SFIthBBCOAhNgzEj3Ei7YaLbyBjcPDS9QxIOoHZtmD8f9u+HGTP0jsZ5SVIthBBCOIglS2DbNy6E94snsGaG3uEIBzJgAPTpA5Mnw+HDekfjnCSpFkIIka+9e/fSrVs3OnbsyPDhw0lJScl3P03TGD9+PMuWLbNzhGXLsWMwYgS0CrfSvOsVvcMRDsZgUKPEBAer5PrqVb0jcj6SVAshhMjj2rVrTJgwgXnz5rFt2zaCg4OZPXt2nv2io6MZOHAgW7du1SHKsuPKFejZE/z94aPFmRjuuHrHJqXlWrKs0ixE5Lh1Xty0pfHRJxnExWn07g0WS84+SWnmPOdRUppZv6AdkIveAQghhCh9Dhw4QKNGjQgNDQWgT58+REREMHnyZAy3DYi8evVqnnnmGarImG73jcWiJna5fBkOHIBK/rnfz8iysuzAhVzbBoeF2i0+Ubrld35MnV2XMcPdGT8ebt0rp2ZamL8nOtd+r7atRXkvNztF6vgkqRZCCJHH5cuXCQwMzF4PDAwkJSWF1NRUfHx8srdPmjQJgMNFaKSZmZnJqVOnihxTRkbGPR1XGhQn9pkzA9i9uyLTp8fh7Z1Makolrl9Pyn7fag3OtV6cbfntg3Zvx93r95Xkcc4Ue2pKKqcuX8y1i9Gn0j1936AeNzh22ERkZAUCAv6gW7cb+X5Wft95p/yOs9kCyuT/q5JUCyGEyMNms+W73WgsfqtBd3d36tevX+TjTp06dU/HlQb3GvuqVbByJbz2GowfXwWoQmxSGn5+5bP3MZlMudaLsy2/fTBwT8fd6/eV5HHOFLu3jzfVgnM/prjzXCjs93n7eLNihRexsTB5clXat69KQGDez8rvO++UXwxGo5F6Tvz/akFJt13bVBem08uMGTMIDw8nIiKCiIgIRo4cac8QhRBCAEFBQSQmJmavx8fH4+vri5eXl45RlS1Hj6oJO9q0gchIvaMRzsbVFdavV+30e/aEq9L3tdjsllQXttPLsWPHmDNnDps2bWLTpk3MnTvXXiEKIYT4U1hYGFFRUVy4cAGAdevW0a5dO32DKkPOn4enn1YJz7//rRIgIUq6Q2pAAHz5JSQkwOB+7mRlGv76IFEguyXV+XV6+eqrr9C0nBPCbDZz8uRJPv30U7p3785rr71GXFycvUIUQgjxp4oVKzJ9+nSGDx9O586dOXPmDOPGjePEiRNEREToHZ5TS0iAjh0hMxO2blWJjxAZWVbm74nOtVgLaKZVFM2awerVcOwnIxsjQ7Ba/voYkT+7takuTKeX+Ph4WrRowahRo6hRowbLli1j2LBhfPnll7l6mwtRkq5fh3Pn1IUsMVEtCQlwJdmVqNggAAyAwaiRccSLhnXURS4gAKpUgWrVoASamQpR6rRp04Y2bdrk2ubn58emTZvy7DtDpmkrETdvqhrq2FjYuRMaNtQ7IlEWPPMMTJttZvyoB9iyoBpd/xmbZ9hG8dfsllQXptNLcHAwS5YsyV4fPHgwCxYsIDY2luDg4AI/W3qSOxa9YrfZIDranePHPfntN3eio904e9adxMS8z1VdXDQ8PE2YLX7cepii2Qz8sNmUZ19PTxu1a2dmLw0aZNC4cTqenqVnnFg5X/ThyLEL+zObVXJz7Bhs3AhPPKF3RKIs6TfIyjf/u8x3awPxesDCkwMv6x2Sw7FbUh0UFERUVFT2en6dXk6fPs3p06fp0aNH9jZN03D9i8Zk0pPcsdgrdptNdfTZuxe++06N73rtmnrP2xsaNIAuXdRrnTpQubJqv+jvD76+Bv64np5nzM4+jQLxc/cnIUHVZv/+O5w8aeTXXz05dMiTL79U+7m6QvPm0Lp1zuLtfd9/coHkfNFHcXqRi7LFZoOBA1Xt9PLl0LWr2p6UZiY1M/fzeJnYRdwvTzybSFqyC//7yh9vPwv/fFLviByL3ZLqsLAwZs6cyYULFwgNDc2304vRaGTq1Kk0a9aM4OBg1qxZQ7169XI1GxHibtLTYdcu+OortVy6pLbXqQM9eqjkNiwMatS4tyYb7h4QEgwhIfm/f+UK/PAD7N+vltmzYcYM8PCA9u0hIkJdLOWUFkLcYrHAyy/DunUwcyYMGpTzXn4TcsjELuJ+MRig/YuXSL/hwt7Pg1je0Mxb4/SOynHYLam+vdNLVlYWISEhzJw5kxMnTjBx4kQ2bdpE3bp1mThxIkOHDsVqtRIYGMicOXPsFaJwULc686xeDd98oxJrHx/o1Am6dYOnnoKgIPvEUqmSqv3u0kWtp6bCoUPw9dewaZN6BWjRAvr0UbOkVa5sn9iEEKWP2Qz9+6uhzd55B8aM0TsiUdYZjPD0P2PJMhuYNN4XFxtMmKB3VI7BrpO/FKbTy63xqYW4G5tN1QSvXg3/+Y/qbOjvr2p4evRQ47q6u+sdpWry8dRTapk7F06cgM2bYcMGGDECRo1SNdj9+qlxQm+bqE4I4eQyMuC559TNdmSkKg+EKA1Mrho9X/+d39bX5403XLhxA6ZNUzXZomAyo6JwKHFxsGIFLFumRuzw9lbJaL9+Kjl1KcVntMEAjRurZeJEOHlS3RSsXg0DBqiEundvNdlD8+ZSeAnhzFJTVXOwXbtg4UIYMkTaTwv7ik1Ky7V+57lmNMHchWYCKrgwYwakpMCHH8poV3dTilMQIRSrVTXvWLJENe+wWiE8HN59V9VK69kBsDgaNICpU2HKFNVEZPlyWLMGli6FRo1Ucv3CC+Dnp3ekQoiSlJioyq7Dh9UU5AMGqO3SflrYS0aWlWUHLuTalt+5ZjSqmz4fH/U05eZN+OQTcHOzT5yORu43RKmVmKg6+dWqpdpGHzmi2hueOQN79qjaaUdNqJPSzNkzYsUlpxHaMI3Z88xcugSLFqmmK8OHq3GwX3kFjh/XO2IhREmIilJPoo4ehS++yEmohSitDAZ4/33V5n/lSvVUOCFB76hKJ6mpFqWKpqnam/nzVccdsxnatlV3yN27O89UvfnVSL3athZg4em/w9N/h19+NrBmhRurV5tYuhQefxyGDVNtMEtDe3EhRNFs2KCSaD8/1SekeXO9IxKicAwGmDRJjaQ1eDA8+qjqfP/II3pHVrpITbUoFdLTVfOHRx9VEx589RX84x+q3fHu3fDss86TUBfkzilo9109y7Q5mcTFqU6OV6+q5iAhIfDWW2rGNSFE6WezwccfV6JXL9Wn4scfJaEWjqlPHzXng6ZBy5ZqGEiRQ2qqha4uXFDNHZYuVUljw4aq/Vb//iU3EkZ+nX+83V0o7+UYjcL8/NRIIa+9pjo1ffyxaos9fbqafe2f/4RWraRjoxD2kF954moy5Orkdft6YgKMHeHOzm3+PNfHwrRIM1YPiE3Ke5x0ShSlXVKamYAaFjbvhH8McqdPHxODh7pSvrUBFzc5fyWpFnZns8H27aqJx61xm3v0UMlheHjhk8PCXNxAXag+2X8u17ZX29bKlVTfa697eybsRmPO8Hznz6ubj6VLVTOZRo1U05CSvBkRQuRVUGfC2zt93Vo/c+QBvl1Ulcx0A29OScNSP5pl39/9OCFKs9vP//CRBqwrgli2sCKVvq5N1+ExBNbM0DlCfUlSLewmKQk++wzmzq3JhQtqXOnx41Uzj4JmKLybwlzcbm3Lz+3DCeWXeBfmAldQ2+g7k+o7k++i1EjdHuethL1GDZg1C95+Wz1++/hjGDoUxo1TUx0PGwYPPljorxBClKCbN+DredX4ZW95KtdIp8/wGF54PoAV3//1sUI4CpOrRodX4hg2wJORr7ry2fjatPx7PI/3TNQ7NN1IUi3uq1sdDxcvVj3dMzLg4YetrFoFvXrp1+HuzuGESrqGKL/xP29P2gv7fXfGeWfC7uUFPXubeaqHhaP/M7JymQuLFpmYN89A69bqhuXZZ4v1U4QQhaRpEH20HF1HeHMpzsATvRJo2SsBk6s8FhfOq007K4M/uMD2JVX4bm0gZ398gJYfZ1AvWO/I7E+SanFfXLsGa9eq8Sx//lk1SRg4UCV5Hh4XqV+/vt4h3jeFHf/zXt0tYa/XG6p1NuFzsTZffO5Gv35qaL6evULoMzCdug/mXNwdqV25EHooSrOwKzHu7FoRxPnj5ahZ20r/qeeoWjfdHmEKoTvPclYiRsVQ92832L6kCj07e/Lyy2oehoAAvaOzH0mqRYmxWmHHDjWKx8aNaji8xg/bmDEni4hnrfiUU/vZLFVyJYb5tYMuzLay2KmnMAm7t6+VYSMsvDfJjV271FOCFcu8WLrYQFCdNBq3TaJ+2HVGd60hSbUQd1GYyVjSb5p49w13Vi2vg5uHjXYvxjFvSjk+OyIJtSh76rdMJrRxCkn7Q/n0Uy/WrVMzCA8fXjaGgpWkWhSLpqmJSdauVbMB/vEHVKigaqRffBH8QzOYvyealT/mHDPo8WBWfJdzoSqoHfRfbZNOPXd3e8fGg0evMumjLE7sKc+2T6qyc3kQ0V1tvDwIOnYsG4WdECUp7YaJn7ZU5KetFTGnmWjS/hqtesfj5WvF1bWc3uEJoRvPclaGvp3KG2O9eP11GDtWday/1efHw0PvCO8fSarFPfm//1OJ9Lp16m8XF5WczZ2rZj+8laTFJukbp1Aq+Ws81v0KzbtdIf6cBz/vrsCBfRX46ks1ZN8zz6jxR8PD1X9LIUT+LsUZ2Lk8iKgdFcjKNFKneTJzZrpwMClO79CEKFXq1VNzTmzfrmqrhwyByZPhX/9Sf/v66h1hyZPLpygUm01NWLBxo1pOnVJD37VpA6NGqc5wRk/V/jAxDfizdYezNdFwd3fLM2qIIzEYILBWBoG14vh/Kz05/ZMXa9eqYfk+/RQqVlQ3RRER0KGD6ggphDMqynCYmgYxJ72J2lWeyEPeWKzeNGx9nRY9EqkUnMmDDUM5eMBekQtR+t1+rWzQHL7d40LUD27MmKFG/Zo2DV5+GV56Sc1P4SwkqRYFun5dzWa4bZsaTzouDkwmlUgPGQLtupjxraguSulAVtq9DUvnSDKtGosP5G66UlrdnvwbXfJOR+nqCp07qyU9HbZsgS+/VMuKFeDpqZqOdO6sEuyaNe0YvBD3WWGGw4yLNXDwP/6c2FOe65fdcfey0ntAFj6PnsM3IMveIQvhMO68Vr7athZt27rRti0cPaqGhP3oI5gzR80u+uKL6mmpn5+OQZcASapFdo1NejocP2rkx+9d+W6PiSNHVA11uXLQpq2NsZ2zeLKDlfLl1XFZVo35e4o+TJy4/+7s0Djo8buPbeTpqZ42PNnZzJQUC0cOGdm2xcSOrSY2bzYCKqnu0AHat4ewMKhc+X7+AiH0ceYMbN6slgMHPNA0T6o3SiHs7wnUa5HMkHbVWXZAEmoh7lXTpqrpaGIirF6tBjcYNkw1C+nQAbp3h65dITBQ70iLTpLqMiwuTjXp2LrTwFfbNS5Fe2KzGDEaNZo3hzffVCf43/4G8Smqw+Ga4znHSxLtfFIzLXzyZ+1CYCfo3xG6hNRm/x4T+/YY+XyViUWL1JSXdeqo5DosDFq0UO3nTKbix3DnY3mPByoU/0OFKEBGqpE/Tntz8Rdv1o/3IPo3tb1JE/jX2CzSqp/Dr7Ik0UKUNH9/GDkSRoyAY8fU5HAbN6p22ACPPaaS6/BwVZvtCB0cJakuAywWOHcOfv1VjdTx009quXxZve/m5kJATTOPdb1CtfppTH4lINcjmPgUx2s7LEqGwQBVqltIrX2WR2vDI4MMPOFbmx+PGPnhiJGNm0wsX66SbC8vlYg0a6aWkNpZVK2ehZe3+qzCjot952P5Qc0dsLpC6OrOG7Nb557VCmfPqnJw+25Xvt5Rm4QLHqAZMLrYaBmmMXK4qikLCYHYJAvz90hCLcq2kupHdOccC7cPkxtQA16fDOPfMXDiF9ixVT0pnTRJ1dS4uWk83NTGY4/baPkEtGrhStWq6hpVmtg1qd67dy+RkZGYzWbq1avHtGnT8PHxKfI+Ii+bTSXJ0dEqgY6OVo8xT55Uo3OYzWo/oxHq11c10LeSn4Aa6Xx6OKcZh4d3RebvuZDr86VW2jnlN5HM3ZhcNR5qmsWRtAs0awRNB8PVP9xp6Fqd86fdOXpUdXicNw/AFXDFN8BMpWoZtHvclYcbqGYkNWtC9eoylF9p56hldnKqhRnrY0i65Ma1S+4Eaf6cPaUmokpNVft4eLpQuXYmYX9PILh+KlXqpjGyU02qlZfeuULcUlKzDxc0x0J+23bHX8DUFDo1hU8ahDJjxVViT3kTc8qbHz/0ZP4HKpOuUEFV5Dz8sMpr6tSB2rWhShWV6+jBbkn1tWvXmDBhAmvXriU0NJT333+f2bNn8/bbbxdpn7ImMxOuXoWEBNX+KDFR/X3iRAAZGRAbq8aG/uMPNQX4LUYjBIdo1K5ro2W4jboP2qhTT6NBAw03j9yJk9RCl00lMfOjwQCVqmXSq62VW0O+WK1wPtrAqVMG1m6/ztUYD67EurNymQuZGbmPDQqCqlVzL27lTJyNK4fXAxa8fC2kpBjQtNJXI+HsSmOZrWmQnJxTFiYmqmZssbE5y++/w/nznlgs9bKPK1dO45FHYPBgdRFu0gR8q6Sz5OD5+xKnEKJklK8AdR+7Sd3HbgJgzjAQVr42cec8iIpST50WLsyd/3h6qoqbkBCoVk1dV6pVU8m2vz9UqqRevb1LPl67JdUHDhygUaNGhIaGAtCnTx8iIiKYPHkyhj+vloXZ537QtNyLzaaWW39brTnbrNbci8WiXrOy8i6ZmTmL2QxXky1cv2kjI12dABnpBtLTDNy8CakpkJJiIC0Vkq8bSE42kJwMmRn5/243twoEVrERGKTR8GGNDl00qlXXCKluo3oNjarVNAymnNE4EoCEZHjQFCq10KLE5Zugdwnl9wcSs9eHtqmFq9kr19OUs+etxMTAyVMGdu82cOOGAXAHQrOPW4QaO9vPL2fx9QUfH9WJ1sdHLV5eavH0zFnc3XMWNzf16uqqPs/VNedvFxfVHvzWq8mkbkyNxpy/DYa8r7cWZ1TayuzPP4eXX66X/dTtdiaTumBWq6YS5g5PWzhnjqdCUCblg8yM7Vmd4Aq5a6BlDH0hHI+bh0bzFjaqdc7ZZrVCTIxq2vXbb+o1OlrdZB89CvHx+X+WlxcsWwa9e5dcfHZLqi9fvkzgbV05AwMDSUlJITU1NftRYWH2KSmDB8Onn9Yv0c/8a7n/uY0mDR8fwDULNw8brp42agS6YayQQlCIlVAvKx4+Vto18eN4Ynx2zZ3XA1aGPFWFlYdjcn7Pn49RfgV+vQhclGRZlC5GI1g90ghtCKEN4UnUU5Lbh2E0ZxjoWieUFbsvk5bsQtoNFxpXrMjNmy7cSIYbyQZ103kT/rikbkJTUw2kpBR8A2ov5crBwYPQqJGuYZSY0lZmN20KAwdeo27dSvj7k71UqaJGorl90qLYpCzm78nJmp31xkcIoW6qQ0PV0r593vfNZvVE69Il9XTryhX1eu1ayZfXBk3T7PLsf9GiRcTFxfHuu+8CYLFYaNiwIceOHcPrzxkmCrNPfo4fP467NM4UQjigzMxMmjRponcYeUiZLYQQ+Suo3LZbTXVQUBBRUVHZ6/Hx8fj6+uYqeAuzT35K4wVJCCEcmZTZQghRNHbrHxkWFkZUVBQXLlwAYN26dbRr167I+wghhLj/pMwWQoiisVvzD4B9+/YRGRlJVlYWISEhzJw5k5iYGCZOnMimTZsK3MfP0eetFEIIByRlthBCFJ5dk2ohhBBCCCGckU7DYwshhBBCCOE8JKkWQgghhBCimMp0Up2WlsbQoUPp168fgwYNIr6gEcJLoZs3bzJkyBD69+/P888/z7Fjx/QOqUh27NjB6NGj9Q6jUGw2G5MmTeL555/nhRde4OLFi3qHVGRRUVG88MILeodRJFlZWYwZM4a+ffvSq1cvdu3apXdIhWa1WpkwYQK9e/emT58+nDlzRu+QnIKU2fpylHJbymx9SJldxpPqf//73zRs2JDVq1fTvXt3lixZondIhbZ8+XJatGjBqlWrmD59evY4sY7gvffeIzIyEpvNpncohbJz507MZjNffPEFo0ePZsaMGXqHVCRLlixh4sSJZGZm6h1KkWzevBk/Pz/WrFnD0qVLmTJlit4hFdqePXsANRrGyJEj+eCDD3SOyDlIma0fRyq3pczWh5TZdhynujQaNGgQVqsVgLi4OB544AGdIyq8QYMG4ebmBqg7LEeaSKFp06a0b9+eL774Qu9QCuWnn36iVatWgBpf95dfftE5oqIJCQlh3rx5jB07Vu9QiqRTp0507NgRAE3TMJlMOkdUeO3btyc8PBxwvLKlNJMyWz+OVG5Lma0PKbPLUFK9fv16Vq5cmWvbtGnTaNy4MQMGDODMmTMsX75cp+ju7m6xJyYmMmbMGN544w2doitYQXF36dKFI0eO6BRV0aWkpOSactlkMmGxWHBxcYz/fTp27EhsbKzeYRSZt7c3oP79hw8fzsiRI3WOqGhcXFwYN24cO3bs4KOPPtI7HIcjZbY+nKHcljJbH1JmA5rQNE3Tzp49q7Vr107vMIrk9OnTWpcuXbS9e/fqHUqRHT58WBs5cqTeYRTKtGnTtG+++SZ7vVWrVjpGc29iYmK05557Tu8wiiwuLk7r2bOntn79er1DuWcJCQlaeHi4lpqaqncoTkXKbPtzlHJbymz9lPUyu0y3qV68eDEbN24E1B2WIz2qOHv2LCNGjCAyMpI2bdroHY5Ta9q0Kfv37wfg+PHj1K1bV+eIyoYrV67w0ksvMWbMGHr16qV3OEUB50ypAAAEy0lEQVSyceNGFi9eDICnpycGgwGjsUwXtyVCymxRGFJm60PK7DLU/CM/zz77LOPGjWPDhg1YrVamTZumd0iFFhkZidlsZurUqQD4+PiwcOFCnaNyTk899RQHDx6kd+/eaJrmUOeJI1u0aBE3btxgwYIFLFiwAFAdeDw8PHSO7K916NCBCRMm0K9fPywWC2+88YZDxF3aSZktCkPKbH1ImS0zKgohhBBCCFFs8jxSCCGEEEKIYpKkWgghhBBCiGKSpFoIIYQQQohikqRaCCGEEEKIYpKkWgghhBBCiGKSpFo4rb59+xY4o9PevXt56KGHSEpKKvB4i8VCvXr1HGYWMSGEcHRSbgtHJkm1cFrdunVj3759ZGZm5nlvy5YthIWFUb58eR0iE0IIkR8pt4Ujk6RaOK1OnTqRlZXFd999l2u72Wxm9+7ddO/eXafIhBBC5EfKbeHIJKkWTqt8+fKEhYXx7bff5tq+f/9+bDYbTz75JCkpKUyYMIHHH3+chx56iE6dOrFz5858P69169b897//zV4/dOgQ9erVy16Pi4tjyJAhNGnShLZt2/LBBx+QlZV1f36cEEI4ISm3hSOTpFo4ta5du7J3717MZnP2tq1bt9KhQwc8PDx47733uHjxIsuXL+frr7/mkUce4c0338y1f2HYbDaGDRtGxYoV2bBhA7NmzWLHjh3MnTu3pH+SEEI4NSm3haOSpFo4tXbt2mG1Wjl06BAAmZmZ7N69m27dugHw6KOP8s477/Dggw8SGhrKSy+9xPXr17l69WqRvufgwYPEx8czZcoUatWqRfPmzXnrrbdYtWoVNputxH+XEEI4Kym3haNy0TsAIe4nT09P2rVrx7Zt2wgPD2ffvn14e3vTokULAJ555hm2b9/OunXrOHfuHL/++isAVqu1SN8THR3N9evXadasWfY2TdPIyMjg0qVLVK1ateR+lBBCODEpt4WjkqRaOL1u3boxduxYLBYLW7ZsoUuXLphMJgBGjx7Nzz//TEREBH379qVChQr07ds3388xGAy51i0WS/bfVquVmjVrsmDBgjzH+fv7l+CvEUII5yfltnBEklQLp9eyZUuMRiPff/89+/bt4/PPPwcgOTmZLVu2sH79eho3bgzArl27AFVbcSdXV1dSU1Oz12NiYrL/rlGjBnFxcVSoUIFy5coB8MMPP7BmzRpmzZp1336bEEI4Iym3hSOSNtXC6bm4uNC5c2ciIyOpXLkyDz30EAAeHh54enqyfft2YmNj2b9/P1OnTgXIt8NLo0aN2LBhA7/99htHjhzhs88+y36vdevWBAYG8vrrr3P69GmOHj3KxIkTMZlMuLm52eeHCiGEk5ByWzgiSapFmdCtWzdOnTqV3dEFwN3dnVmzZvHtt9/y9NNPM3PmTF599VUqVarEqVOn8nzGqFGj8Pb2pmfPnkydOpURI0Zkv+fi4sLixYvRNI3evXszbNgwWrRowZQpU+zy+4QQwtlIuS0cjUHL73mJEEIIIYQQotCkploIIYQQQohikqRaCCGEEEKIYpKkWgghhBBCiGKSpFoIIYQQQohikqRaCCGEEEKIYpKkWgghhBBCiGKSpFoIIYQQQohikqRaCCGEEEKIYpKkWgghhBBCiGL6/6zw0AfZ9EPXAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 864x216 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = numpy.concatenate([numpy.random.normal(0, 1, size=(750)), [numpy.nan]*250])\n",
    "X_imp = X.copy()\n",
    "X_imp[numpy.isnan(X_imp)] = numpy.mean(X_imp[~numpy.isnan(X_imp)])\n",
    "\n",
    "x = numpy.arange(-3, 3, 0.1)\n",
    "d1 = NormalDistribution.from_samples(X_imp)\n",
    "d2 = NormalDistribution.from_samples(X)\n",
    "p1 = d1.probability(x.reshape(x.shape[0], 1))\n",
    "p2 = d2.probability(x.reshape(x.shape[0], 1))\n",
    "\n",
    "plt.figure(figsize=(12, 3))\n",
    "plt.subplot(121)\n",
    "plt.title(\"Mean Impute Missing Values\", fontsize=14)\n",
    "plt.hist(X_imp, bins=x, alpha=0.6, density=True, label=\"$\\sigma$ = {:4.4}\".format(d1.parameters[1]))\n",
    "plt.plot(x, p1, color='b')\n",
    "plt.ylabel(\"Count\", fontsize=14); plt.yticks(fontsize=12)\n",
    "plt.xlabel(\"Value\", fontsize=14); plt.yticks(fontsize=12)\n",
    "plt.legend(fontsize=14)\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.title(\"Ignore Missing Values\", fontsize=14)\n",
    "plt.hist(X[~numpy.isnan(X)], bins=x, alpha=0.6, density=True, label=\"$\\sigma$ = {:4.4}\".format(d2.parameters[1]))\n",
    "plt.plot(x, p2, color='b')\n",
    "plt.ylabel(\"Count\", fontsize=14); plt.yticks(fontsize=12)\n",
    "plt.xlabel(\"Value\", fontsize=14); plt.yticks(fontsize=12)\n",
    "plt.legend(fontsize=14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Even when the data is all drawn from a single, Gaussian, distribution, it is not a great idea to do mean imputation. We can see that the standard deviation of the learned distribution is significantly smaller than the true standard deviation (of 1), whereas if the missing data is ignored the value is closer."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This might all be intuitive for a single variable. However, the concept of only collecting sufficient statistics from values that are present in the data and ignoring the missing values can be used in much more complicated, and/or multivariate models. Let's take a look at how well one can estimate the covariance matrix of a multivariate Gaussian distribution using these two strategies. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "n, d, steps = 1000, 10, 50\n",
    "diffs1 = numpy.zeros(int(steps*0.86))\n",
    "diffs2 = numpy.zeros(int(steps*0.86))\n",
    "\n",
    "X = numpy.random.normal(6, 3, size=(n, d))\n",
    "\n",
    "for k, size in enumerate(range(0, int(n*d*0.86), n*d // steps)):\n",
    "    idxs = numpy.random.choice(numpy.arange(n*d), replace=False, size=size)\n",
    "    i, j = idxs // d, idxs % d\n",
    "\n",
    "    cov_true = numpy.cov(X, rowvar=False, bias=True)\n",
    "    X_nan = X.copy()\n",
    "    X_nan[i, j] = numpy.nan\n",
    "\n",
    "    X_mean = X_nan.copy()\n",
    "    for col in range(d):\n",
    "        mask = numpy.isnan(X_mean[:,col])\n",
    "        X_mean[mask, col] = X_mean[~mask, col].mean()\n",
    "\n",
    "    diff = numpy.abs(numpy.cov(X_mean, rowvar=False, bias=True) - cov_true).sum()\n",
    "    diffs1[k] = diff\n",
    "\n",
    "    dist = MultivariateGaussianDistribution.from_samples(X_nan)\n",
    "    diff = numpy.abs(numpy.array(dist.parameters[1]) - cov_true).sum()\n",
    "    diffs2[k] = diff"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"Error in Multivariate Gaussian Covariance Matrix\", fontsize=16)\n",
    "plt.plot(diffs1, label=\"Mean\")\n",
    "plt.plot(diffs2, label=\"Ignore\")\n",
    "\n",
    "plt.xlabel(\"Percentage Missing\", fontsize=14)\n",
    "plt.ylabel(\"L1 Errors\", fontsize=14)\n",
    "plt.xticks(range(0, 51, 10), numpy.arange(0, 5001, 1000) / 5000.)\n",
    "plt.xlim(0, 50)\n",
    "plt.legend(fontsize=14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In even the simplest case of Gaussian distributed data with a diagonal covariance matrix, it is more accurate to use the ignoring strategy rather than imputing the mean. When the data set is mostly unobserved the mean imputation strategy tends to do better in this case, but only because there is so little data for the ignoring strategy to actually train on. The deflation of the variance benefits the mean imputation strategy because all of the off-diagonal elements should be 0, but are likely to be artificially high when there are only few examples of the pairs of the variables co-existing in the dataset. This weakness in the ignoring strategy also makes it more likely to encounter linear algebra errors, such as a non-invertable covariance matrix."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This long introduction is a way of saying that pomegranate uses a strategy of ignoring missing values instead of attempting to impute them, followed by fitting to the newly complete data set. There are other imputation strategies, such as those based on EM, that would be a natural fit with the types of probabilistic models implemented in pomegranate. While those have not yet been added, they would be a good addition that I hope to get to this year.\n",
    "\n",
    "Let's now take a look at how to use missing values in some pomegranate models!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Distributions\n",
    "\n",
    "We've seen some examples of fitting distributions to missing data. For univariate distributions, the missing values are simply ignored when fitting to the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting only to observed values:\n",
      "{\n",
      "    \"class\" :\"Distribution\",\n",
      "    \"name\" :\"NormalDistribution\",\n",
      "    \"parameters\" :[\n",
      "        -0.0844412750220139,\n",
      "        0.9166407920894343\n",
      "    ],\n",
      "    \"frozen\" :false\n",
      "}\n",
      "\n",
      "Fitting to observed and missing values:\n",
      "{\n",
      "    \"class\" :\"Distribution\",\n",
      "    \"name\" :\"NormalDistribution\",\n",
      "    \"parameters\" :[\n",
      "        -0.0844412750220139,\n",
      "        0.9166407920894343\n",
      "    ],\n",
      "    \"frozen\" :false\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "X = numpy.random.randn(100)\n",
    "X_nan = numpy.concatenate([X, [numpy.nan]*100])\n",
    "\n",
    "print(\"Fitting only to observed values:\")\n",
    "print(NormalDistribution.from_samples(X))\n",
    "print()\n",
    "print(\"Fitting to observed and missing values:\")\n",
    "print(NormalDistribution.from_samples(X_nan))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This may seem to be an obvious thing to do. However, it suggests a way for dealing with multivariate data being modeled with an IndependentComponentsDistribution when some of the features are missing. Specifically, treat each column independently, and update based on the observed values, regardless of if there is an unobserved value in the same sample but another column. For example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{\n",
       "    \"class\" : \"Distribution\",\n",
       "    \"name\" : \"IndependentComponentsDistribution\",\n",
       "    \"parameters\" : [\n",
       "        [\n",
       "            {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"name\" : \"NormalDistribution\",\n",
       "                \"parameters\" : [\n",
       "                    -0.08339536402140717,\n",
       "                    0.9112109573110577\n",
       "                ],\n",
       "                \"frozen\" : false\n",
       "            },\n",
       "            {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"name\" : \"NormalDistribution\",\n",
       "                \"parameters\" : [\n",
       "                    0.048834959770246114,\n",
       "                    0.9877919452098168\n",
       "                ],\n",
       "                \"frozen\" : false\n",
       "            },\n",
       "            {\n",
       "                \"class\" : \"Distribution\",\n",
       "                \"name\" : \"NormalDistribution\",\n",
       "                \"parameters\" : [\n",
       "                    0.014464502073682939,\n",
       "                    0.9392312251035693\n",
       "                ],\n",
       "                \"frozen\" : false\n",
       "            }\n",
       "        ],\n",
       "        [\n",
       "            1.0,\n",
       "            1.0,\n",
       "            1.0\n",
       "        ]\n",
       "    ],\n",
       "    \"frozen\" : false\n",
       "}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = numpy.random.normal(0, 1, size=(500, 3))\n",
    "idxs = numpy.random.choice(1500, replace=False, size=500)\n",
    "i, j = idxs // 3, idxs % 3\n",
    "X[i, j] = numpy.nan\n",
    "\n",
    "d = IndependentComponentsDistribution.from_samples(X, distributions=[NormalDistribution]*3)\n",
    "d"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Easy. As we saw above, we can do the same to learn a multivariate Gaussian distribution in the presence of missing data. Again, we don't need to change anything about how we interact with the data, and there are no flags to toggle.\n",
    "\n",
    "The last aspect is that the probability of missing data under any univariate distribution is 1, for the purposes of downstream algorithms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "NormalDistribution(1, 2).probability(numpy.nan)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In an IndependentComponentsDistribution, this just means that when multiplying together the probabilities of each feature to get the total probability, that some dimensions don't factor into the calculation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.00015597177674513935"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.probability((numpy.nan, 2, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0001559717767451392"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.distributions[1].probability(2) * d.distributions[2].probability(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. K-Means Clustering\n",
    "\n",
    "K-means clustering mostly serves a helper role in initializing mixture models and hidden Markov models. However, it can still be used by itself if desired. In addition to having the same parallelization and out-of-core capabilities of the main models, it also supports missing values now."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = numpy.concatenate([numpy.random.normal(0, 1, size=(50, 2)), numpy.random.normal(3, 1, size=(75, 2))])\n",
    "X_nan = X.copy()\n",
    "\n",
    "idxs = numpy.random.choice(250, replace=False, size=50)\n",
    "i, j = idxs // 2, idxs % 2\n",
    "X_nan[i, j] = numpy.nan"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Just like the other models, you don't need to change the method calls in order to handle missing data. You can fit a K-means model to data sets with missing values and make predictions on samples with missing values in the same way you would without missing values. The prediction step will assign samples to the nearest centroid in the dimensions that are observed, ignoring the missing values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAy4AAAF2CAYAAACI8cwYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deXhU5d3/8c8EAmGRB0ERXBKUKuSHIAKCKIgWARes+FQUiFELZXEpiIqKsUgjwa02WAUpPipU0ktcW4yKItIqFNGisVYCKgpoDZZFRcSwZX5/TBOyzD5nuc+Z9+u6uDRnZk7uDOH+zPecewkEg8GgAAAAAMBgGW43AAAAAABioXABAAAAYDwKFwAAAADGo3ABAAAAYDwKFwAAAADGo3BB3FiADgDgJeQW4C8ULmkoPz9fnTt3DvvnzDPPlCQ9//zz6ty5s3bu3ClJ+sc//qFJkyZZ3pb169erb9++qqqqSur11e3s2rWrvvvuu7DPmTZtmjp37qzCwkJJ0po1a9S5c2d9+OGHSbe7tvz8fE2YMMGSc0Vy++2365RTTtEPP/wQ9vFvvvlGJ598subOnRvX+f7+97+rc+fOKi8vt7KZAGALr+RWdb507txZGzZsCPv6hx9+WJ07d67JjS+//FKdO3fW0qVLLWnfbbfdpmHDhllyrkjmzJmjzp07a8uWLWEfP3jwoM444wwVFBTEdb7Nmzerc+fOev31161sJnyosdsNgDt69uypW2+9tcHxzMxMSdLZZ5+txYsXq1WrVpKkZ599Vp9//rnl7XjrrbfUr18/ZWSkVkMfPHhQb7zxhi655JI6x/fv36/ly5fXOda1a1ctXrxYnTp1Sul7VrvzzjtTbn8sl1xyiZ577jm98cYbuuiiixo8vnTpUh08eFDDhw+3tR0A4BYv5VYgENCyZcvUuXPnBo+9+uqrdb5u166dFi9erI4dO1rSvmuvvVZ79uyx5FyRXHzxxXrooYf08ssva+LEiQ0eX7VqlXbs2NEgk4FUUbikqVatWqlHjx4RH2/Tpo3atGljeztWrlxpyZWhU089Va+99lqDTnL16tUKBAI66qijao61bNky6s+eqJ/85CeWnSuS3r1769hjj9XLL78ctnB58cUX1bdvXx199NG2twUA3OCl3KrOpOuvv77O8Y0bN2rjxo068cQTa441adLE0kzKzs627FyRHHvssTrttNMiFi4vvviicnJy1Lt3b9vbgvTCUDGEVfuW+2233aYXXnhBn3zyiTp37qw1a9Y0eP61116r/Pz8mq+rqqrUp08f5eXl1Rw7ePCgTjvtNJWUlEiS9uzZo/fee08DBgyQFBqL/PTTT+uiiy5S9+7dNWTIEC1YsCCu9g4dOlSrVq1qMJRq6dKlGjx4sBo3PlSj1x8qtm3bNk2ePFl9+/bVKaecotGjR+udd96peX6sx2sPFas+9z/+8Q+NHDlS3bp106BBg/TMM8/Uadf69et15ZVXqkePHho0aJD+8pe/aPDgwXrooYfC/nyBQEAXX3yxVq5cqe+//77OY//+97/13nvv1bnbsnHjRk2aNEl9+/bVySefrJ/+9Kd65JFHIo73vvnmm3XxxRc3eO86d+6srVu31hx766239POf/1zdunXTwIED9fDDD9cZLrFx40aNHTtWvXv3Vs+ePTVu3Dh9/PHHYb8nAFjJjdyKZOjQodqwYYM2b95c5/jSpUvVt29fHX744TXH6g8V27NnjwoKCtS/f391795dl1xyiV577bWa58d6vPZQsepzv/HGGxo7dqxOOeUUDRgwQI888kiddn355Ze65ppr1LNnT/Xv31+PPfaYrr76at12220Rf8bhw4drw4YN2rhxY53jP/74o15//fU6mfL111/rtttuU//+/dW1a1cNGDBAd999t/bt2xf23MXFxQ2Kng8//LAmX6v985//VH5+vk455RT169dPM2fOVGVlZZ3vW52Fp5xyivLy8uq8Ht5D4ZKmgsGgDhw40OBPONdee60GDhyo4447TosXL1bXrl0bPGfAgAEqKyur6TA2bNig7777Th9++GFNx/TBBx9o165dOuussyRJ77zzjrKzs9W+fXtJ0u9+9zvNmDFDP/3pTzV37lydd955uvfee1VcXBzz5znnnHNUVVWlv/3tbzXHDhw4oOXLl+u8886L+tqpU6dqy5YtuvvuuzV37lw1a9ZMEyZM0LfffhvX4+FMmTJFQ4cO1fz58/X//t//0x133KFPP/1UkrR9+3ZdeeWV2rt3r373u99p3LhxKioqUkVFRdR2Dh8+XPv27WswBri0tFTNmzfX0KFDJUm7d+9Wfn6+du3apfvuu09/+MMfdNppp2n27Nl68803o36PaFauXKkJEyaoY8eOmjNnjn7xi1/o0Ucf1axZsySFAr66gJs9e7Z+97vfafv27Zo4cWLSc5gAoJqJuRVJz549deSRR9YpKKRQ4RIrk4qKivT222+roKBA8+fPV6dOnTR58uSaAiHW4+FMmzZNp5xyiubNm6dzzjlHs2fPrsnLyspKXX311fr88891991365ZbbtEf//hHrV27Nmo7hw4dqmbNmumVV16pc3z58uX68ccfa0ZAHDx4UGPHjtWGDRs0Y8YM/d///Z+GDRumBQsW6Nlnn436PaLZsGGD8vPz1aRJEz344IO68cYbVVpaqhtvvLHmOTfffLP+/e9/65577tHcuXOVmZmp8ePHa9euXUl/X7iLoWJp6m9/+1vYjnz16tUNbrVnZ2erTZs2+uqrryLezj7rrLM0Y8YMvf/+++rXr5/WrFmjLl26aMOGDfrwww/Vq1cvrVq1SieccIKOO+44SaEPwtWTKr/55hs98cQTGjt2rKZMmSJJ6t+/v4LBoB577DFdddVVUYcAHHbYYerXr5+WLVumCy64oOZnkaTTTz896nuxdu1aXX/99frpT38qSTrxxBP1xBNP6Mcff1Tr1q1jPh7OlVdeqV/84heSQnNqli1bpjfffFM/+clP9OSTT6qqqkqPPvpozVjsww8/POYk0uzsbPXq1UsvvfRSnSFxL774os477zw1a9ZMkvTZZ5/p+OOPV3Fxcc1VvX79+um1117Tu+++q4EDB0b9PpEUFxerV69eeuCBBySF/s4PO+ww3XHHHRo7dqwCgYC++OIL3XTTTerfv78kqX379nr55Ze1Z88etWzZMqnvCwCSebkVTSAQ0Lnnnqtly5Zp3LhxkkJ988aNGzV48GCVlpZGfO3atWt15pln6vzzz5cUKoKOOOKImiIt1uPhnH/++TUZ07dvX7366qt68803NXDgQC1ZskRfffWVXnnlFeXk5EiSTjjhBP385z+P+jO2bNlSgwcP1ssvv1xnSFz9octbt25V69atdeedd9YMkevXr5/efPNNvfvuuxo9enTU7xPJnDlzdNRRR2nevHk185yOO+44XXXVVXrvvffUs2dPrV27VjfeeKPOOeccSaGh3QsWLNCePXtq8hfeQuGSpnr16qVp06Y1OJ7sP+RjjjlGJ5xwgt5++23169dP77zzjs455xwdOHBAa9eurQmA2h+a33rrrZoVRz744APt37+/wZWoCy+8UPPnz9cHH3xQ0/FEMmTIEM2aNUv79u1TkyZNtHTpUp177rl1homF07t3b/3+97/Xhg0bNHDgQA0cOLDOBNBYj4dTOyhbtWql5s2b10yWXLNmjfr06VPnvY6nnVLorstvfvMbffPNNzr88MO1fv16ffLJJ7rzzjtrntO9e3eVlJRo//79+uSTT7R582Z99NFHqqqqinhbPpbdu3fro48+0tSpU+uE44ABA1RVVaU1a9boZz/7mbKzs3X77bdr5cqVGjhwoPr371/n6hcAJMu03Ipl6NCheuqpp7R161a1b99eS5cuVZ8+fWLOw+ndu7eefvpp/ec//9E555yjs88+u86QrViPh1M7kzIyMtSuXbs6mXTiiSfWFC2SdPLJJ+vYY4+N+TMOHz5cS5Ys0fr169WlSxd98803WrVqlWbOnFnznGOOOUaLFi1SVVWVPv/8c23atEnr16/Xzp07k86k6nZfeOGFCgQCNbnUq1cvNW/eXKtXr1bPnj3Vq1cvzZ49W+Xl5XHnN8xG4ZKmDjvsMHXr1s3Sc5511llas2aNqqqq9I9//EOjR4/Wzp07tXbtWn3//ff65z//qcmTJ0sKjaetqKhQnz59JKlmKeMjjjiizjnbtm0rKfTBOZZzzz1XM2bM0MqVK3XWWWfp9ddf129/+9uYrysuLtacOXP0yiuv6KWXXlJmZqYuuOACFRYWKisrK+bj4dQ/npGRUTO/5Jtvvmkwob9Ro0Z1xjxHcv7552vmzJlatmyZLrvsMr344os67rjjGowFnjNnjh5//HHt3r1bxxxzjHr27KnGjRsnvafBd999p2AwqPvuu0/33Xdfg8e3bdumjIwMLViwQA8//LCWLVumZ599Vs2aNdOoUaN0yy23KBAIJPW9AUAyL7di6dOnj1q3bq1ly5YpPz9fr776qkaNGhXzdXfccYfatWunv/zlL1qxYoUyMjI0cOBAzZo1S23atIn5eDjRMunbb78N+7r6eRxOv379dNRRR+mVV15Rly5d9MorrygzM1NDhgyp87zFixfrwQcf1I4dO9SuXTv16NFDWVlZSWdSMBjUd999p5KSkpr5R7Vt27ZNkvT73/9ec+bM0dKlS1VaWqrMzEwNGzZMhYWFatKkSVLfG+6icIFlBgwYoEWLFqmsrEw//PCDTj31VH3zzTcqLCzU3//+dzVt2lS9evWSFLrd3qtXr5rOtHrI1fbt2+usALZ9+/Y6j0dz+OGH67TTTtOyZctqztuvX7+Yr2vdurUKCgpUUFCg8vJyLVmyRE888YR+8pOfaPz48TEfT9RRRx1Vs89AtaqqqqhzZqoddthhOvfcc/Xyyy9rxIgReumll3TppZfWKQqeffZZPfTQQyosLNQFF1xQM0QrWtgGAoEG81BqL6d52GGHSZKuv/56nX322WF/Jil0Ze3uu+/WwYMHVVZWpqefflqPP/64evToUTMHBwBMkUpuxdKoUSMNGjRIr732ms466yx98sknDT7Qh5OVlaVJkyZp0qRJ+uyzz/Tqq69q7ty5evDBB/Wb3/wm5uOJateundatW9fg+M6dO3X88cdHfW1GRoYuvvhivfzyy5oyZYpKS0t13nnnqXnz5jXPWb16taZPn65f/epXGj16dE2RFG2p5FiZFAgE1LJlS51//vm67LLLGry++nscfvjhuuOOO1RQUKB169bpxRdf1IIFC3TSSSdpzJgxUX82mInJ+YhLPPuU9OnTR5mZmZo/f75yc3PVokULnXbaadq1a5eeeOIJ9evXr+YKx8qVK2vmQUhSt27dlJmZ2WADrpdfflmNGzdW9+7d42rnkCFD9MYbb8Q9TGznzp06++yzayZQ5ubm6tZbb9XRRx+tioqKmI8no3fv3nrnnXfq3EV68803tX///rhef/HFF+vdd9/VW2+9pa1btzbYu6WsrEzHHHOMLrvsspqi5Z///GfNXZNwWrZsqe3bt9d5vPbKK61atdKJJ56oL774Qt26dav506hRIxUXF+vrr7/WunXrdOaZZ2r9+vVq1KiRevXqpbvuuksZGRlJv1cAkCy7cyseQ4YM0dq1a/X000/HNUzs4MGDNRPXpdBck2uuuUY9evRQRUVFzMeT0bt3b33yySf64osvao59/PHHdb6OZvjw4dqyZYtWrVql9957r0FBUlZWpsaNG+uaa66p+fm3bt2qTz75JGom7dmzp05O1l8NrFevXvr888/rZFK7du30wAMP6NNPP9X27ds1cOBALV++XIFAQF27dtVtt92mo446Sl999VVcPxvMwx0XxKVVq1baunWrVq1apZNPPln/8z//0+A5TZo0UZ8+fbRixYqaKxnt27fXscceq/fff79m5/oDBw5o9erV+tWvflXz2jZt2ig/P1+PPfaYGjVqpNNOO03vvvtuzZKM4b5fOEOGDNFdd92l559/vsFyj+G0adNGOTk5Kioq0p49e9ShQwf99a9/1VdffaXBgwfHfDwZ+fn5WrRokcaPH69x48Zp586dNSunxTOcqn///jr88MNVVFSk0047rcE45G7duumZZ57R3Llz1bt3b3366aeaM2eOAoFAnWUiazvrrLP0pz/9SXfddZeGDBmi1atXa8WKFXWeM3nyZP3qV79Sy5YtNWjQIO3YsUOzZ89WZmamTjzxRDVq1EjNmzfX1KlTdf3116tVq1Z6/vnn1bhx46QXBACAZNmdW/E444wz1KJFCy1cuFB33HFHzOc3atRI3bt315w5c9S0aVOdcMIJ+uCDD7R27Vr95je/ifl4Mn72s59p3rx5mjhxoiZNmqSDBw9q9uzZCgQCcWVSp06d1K1bNxUWFtbs71Jbt27ddODAAd19990aPHiwvvrqKz3yyCM6cOBA1Ey6//77VVBQoFGjRmndunVavHhxnedcd911Gj16tKZMmaLhw4dr7969mjNnjv7zn/8oNzdXRxxxhI477jjNnDlTu3fv1lFHHaUVK1bo66+/1rnnnpvUewX3cccFcbn88svVtm1bTZgwQatWrYr4vOolI2vPuageolT94bWsrEzNmjVrsKPw1KlTdcMNN+jFF1/UhAkT9Morr+jWW2/V1KlT427nEUccoZ49e6pFixZxDROTQsswn3766frtb3+rsWPHauXKlfrtb3+rM844I67HE3X44Yfr8ccfV1VVlSZNmqS5c+fWTDht0aJFzNc3atRIF110kTZt2qT//d//bfD4iBEjNGbMGP3pT3/S+PHj9ac//Unjxo3TJZdcorKysrDnPOecczRp0iS99tprmjBhgj7++GPdc889dZ4zePBgPfzwwyorK9PEiRN1zz33qFevXvrjH/+orKwsZWZm6tFHH9Vxxx2nO++8UxMmTNDmzZs1f/78mMMNAMBqTuRWLJmZmTXL9cczTEwKzXG5+OKLNW/ePI0dO1bPPfecbr31Vo0YMSKuxxOVmZmpxx57TO3bt9ctt9yiWbNm6YorrlCHDh3iyiQpNOxr06ZNGj58eINip3///rrlllu0fPlyjRs3TvPmzdOFF16oiRMn6qOPPgo72uCkk05SYWGhPvzwQ40bN04rVqzQgw8+WOc53bt314IF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nHfeeZo8ebIkKRgMqlGjRi63KD7nnnuu7rrrLknSV199pVatWrncovjde++9GjlypNq1a+d2U+K2fv16/fjjjxozZoyuvPJKlZWVud0kREBW2Y+cchY55TxyKj7G3HF55plntHDhwjrHZs2ape7du2vbtm2aOnWqbr/9dpdaF1mkdl9wwQVas2aNS61KzO7du9WyZcuarxs1aqQDBw6ocWNjfj0iGjp0qL788ku3m5GQFi1aSAq975MmTdINN9zgcovi17hxY916661atmyZfv/737vdnLg8//zzatOmjQYMGKD58+e73Zy4ZWVlaezYsRoxYoQ2bdqkcePGaenSpZ74d+lnZJU7yClnkVPOIqfiZ8y/+BEjRmjEiBENjm/YsEE33nijbrnlFvXp08eFlkUXqd1e0rJlS/3www81X1dVVXkiDLysoqJC1113nUaPHq2LLrrI7eYk5N5779XNN9+syy67TC+99JKaN2/udpOieu655xQIBLR69WqVl5fr1ltv1SOPPKIjjzzS7aZFdfzxxysnJ0eBQEDHH3+8WrdurW3btqlDhw5uNy2tkVXuIKecR045h5yKn9H/6j/99FNNnjxZs2fPVpcuXdxujm/17NlTK1as0AUXXKCysjKddNJJbjfJ17Zv364xY8Zo+vTp6tevn9vNiduf//xnff3115owYYKaNWumQCCgjAyjR5tKkkpKSmr+Pz8/XzNmzDA+DCTp2Wef1ccff6wZM2bo66+/1u7duz3R7nREVtmPnHIWOeUscip+RhcuDzzwgPbt26eioiJJoSsuXplk5SWDBw/WqlWrNHLkSAWDQc2aNcvtJvnavHnztGvXLs2dO1dz586VFJq8afqEvCFDhmjatGnKy8vTgQMHdPvttxvfZi+79NJLNW3aNI0aNUqBQECzZs3iCrOhyCr7kVPOIqcQDzdyKhAMBoO2fgcAAAAASJH5988AAAAApD0KFwAAAADGo3ABAAAAYDwKFwAAAADGo3ABAAAAYDwKFwAAAADGo3ABAAAAYDwKFwAAAADG+/8VKPigrkhz4wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1008x432 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model1 = Kmeans.from_samples(2, X)\n",
    "model2 = Kmeans.from_samples(2, X_nan)\n",
    "\n",
    "y1 = model1.predict(X)\n",
    "y2 = model2.predict(X_nan)\n",
    "\n",
    "plt.figure(figsize=(14, 6))\n",
    "plt.subplot(121)\n",
    "plt.title(\"Fit w/o Missing Values\", fontsize=16)\n",
    "plt.scatter(X[y1 == 0,0], X[y1 == 0,1], color='b')\n",
    "plt.scatter(X[y1 == 1,0], X[y1 == 1,1], color='r')\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.title(\"Fit w/ Missing Values\", fontsize=16)\n",
    "plt.scatter(X[y2 == 0,0], X[y2 == 0,1], color='b')\n",
    "plt.scatter(X[y2 == 1,0], X[y2 == 1,1], color='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can see that there are some blue points in the red cluster on the right plot because those samples are entirely NaN. Any sample that is entirely NaN is assigned to cluster 0. Otherwise, it's still able to identify the two clusters even there there are many missing values."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. General Mixture Models\n",
    "\n",
    "Missing value support for mixture models follows that of k-means fairly closely. Essentially, one passes in a data set containing missing values denoted as `numpy.nan` and they get used appropriately for the fit and predict steps. All methods automatically handle missing values appropriately without any additional flags or methods. \n",
    "\n",
    "Since training is an iterative procedure that involves calculating the probabilities of samples given each component, multivariate Gaussian mixtures will be much slower when handling missing values than they would be when using only observed values. This is because an inverse covariance matrix has to be calculated by subsetting the covariance matrix and inverting it based only on the observed dimensions for each sample. Each sample, then, needs its own matrix inversion. Since there is no single inverse covariance matrix, one also cannot use BLAS or a GPU to accelerate this step. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.79 ms ± 194 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "2.15 s ± 636 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "X = numpy.concatenate([numpy.random.normal(0, 1, size=(1000, 10)), numpy.random.normal(2, 1, size=(1250, 10))])\n",
    "\n",
    "idxs = numpy.random.choice(22500, replace=False, size=5000)\n",
    "i, j = idxs // 10, idxs % 10\n",
    "\n",
    "X_nan = X.copy()\n",
    "X_nan[i, j] = numpy.nan\n",
    "\n",
    "%timeit GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, 2, X, max_iterations=10)\n",
    "%timeit GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, 2, X_nan, max_iterations=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "However, if one was modeling each dimension independently, there should be no hit at all!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.93 ms ± 403 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "3.7 ms ± 124 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit -n 100 GeneralMixtureModel.from_samples([NormalDistribution]*2, 2, X, max_iterations=10)\n",
    "%timeit -n 100 GeneralMixtureModel.from_samples([NormalDistribution]*2, 2, X_nan, max_iterations=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Naive Bayes / Bayes Classifiers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Support for these models mirrors what's been seen before. However, since the fitting step does not involve calculating probabilities of samples, it should be no slower to train them on data sets involving missing values than to train them on dense data sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.22 ms ± 142 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "1.41 ms ± 44.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
     ]
    }
   ],
   "source": [
    "y = numpy.concatenate([numpy.zeros(1000), numpy.ones(1250)])\n",
    "\n",
    "%timeit -n 100 BayesClassifier.from_samples(MultivariateGaussianDistribution, X, y)\n",
    "%timeit -n 100 BayesClassifier.from_samples(MultivariateGaussianDistribution, X_nan, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since pomegranate also has semi-supervised learning built-in, this means that one can now fit Bayes classifiers on data sets with missingness in both the labels and in the values! Since semi-supervised learning does rely on EM, it will be slower to train multivariate Gaussian models with missing values than not to."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1] Improvement: 44.19320307574344\tTime (s): 0.1736\n",
      "[2] Improvement: 0.15779521180411393\tTime (s): 0.1557\n",
      "[3] Improvement: 0.009774176905921195\tTime (s): 0.165\n",
      "Total Improvement: 44.360772464453476\n",
      "Total Time (s): 0.6666\n"
     ]
    }
   ],
   "source": [
    "idx = numpy.random.choice(2250, replace=False, size=750)\n",
    "y_nan = y.copy()\n",
    "y_nan[idx] = -1\n",
    "\n",
    "model = BayesClassifier.from_samples(MultivariateGaussianDistribution, X_nan, y_nan, verbose=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.95 ms ± 88.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "631 ms ± 7.69 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%timeit BayesClassifier.from_samples(MultivariateGaussianDistribution, X, y_nan)\n",
    "%timeit BayesClassifier.from_samples(MultivariateGaussianDistribution, X_nan, y_nan)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Hidden Markov Models\n",
    "\n",
    "Hidden Markov models are slightly different from the others, in that they operate over sequences. This adds another level of complication to the model because the forward and backward algorithms are needed in order to identify the best component for each observation. Typically this involves calculating the probability of each observation given each state, and taking the sum of all paths through the model, multiplying the transition probability of each edge crossed by the emission probability of the state you transition to emitting the next character. If this is a univariate model and the character is missing, you ignore the emission probability and just multiply by the transition probability. This is easily done by having the probability of missing values be 1 under all univariate models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "d1 = DiscreteDistribution({'A': 0.25, 'B': 0.75})\n",
    "d2 = DiscreteDistribution({'A': 0.67, 'B': 0.33})\n",
    "\n",
    "s1 = State(d1, name=\"s1\")\n",
    "s2 = State(d2, name=\"s2\")\n",
    "\n",
    "model = HiddenMarkovModel()\n",
    "model.add_states(s1, s2)\n",
    "model.add_transition(model.start, s1, 1.0)\n",
    "model.add_transition(s1, s1, 0.5)\n",
    "model.add_transition(s1, s2, 0.5)\n",
    "model.add_transition(s2, s2, 0.5)\n",
    "model.add_transition(s2, s1, 0.5)\n",
    "model.bake()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's run the forward algorithm on a simple sequence."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.       , 0.       , 1.       , 0.       ],\n",
       "       [0.25     , 0.       , 0.       , 0.       ],\n",
       "       [0.09375  , 0.04125  , 0.       , 0.       ],\n",
       "       [0.016875 , 0.045225 , 0.       , 0.       ],\n",
       "       [0.0077625, 0.0208035, 0.       , 0.       ]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numpy.exp(model.forward(['A', 'B', 'A', 'A']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see what happens when we remove one of the characters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.      , 0.      , 1.      , 0.      ],\n",
       "       [0.25    , 0.      , 0.      , 0.      ],\n",
       "       [0.125   , 0.125   , 0.      , 0.      ],\n",
       "       [0.03125 , 0.08375 , 0.      , 0.      ],\n",
       "       [0.014375, 0.038525, 0.      , 0.      ]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numpy.exp(model.forward(['A', 'nan', 'A', 'A']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can see that initially the first character is aligned to s1 because there is a 100% chance of going from the start state to s1. The value is 0.25 because it is equal to the transition probability (1.0) multiplied by the emission probability (0.25). In the next step, you can see that the probability is equally diffused between two options, staying in the current state (transition probability of 0.5) and moving to s2 (also transition probability of 0.5). Since the character is missing, there is no emission probability to multiply by. \n",
    "\n",
    "If we want to decode the sequence we can call the same methods as before."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 0, 0, 1, 1]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict(['A', 'A', 'B', 'B', 'A', 'A'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 0, 0, 0, 0, 1]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.predict(['A', 'nan', 'B', 'B', 'nan', 'A'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fitting is pretty much the same story as the previous models. Like the Bayes classifiers, one can now train a hidden Markov model in a supervised manner, having some observations in the sequence missing, but also labels on each observation. Labeled missing data can still be used to train the transition parameters."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Bayesian Networks\n",
    "\n",
    "Bayesian networks could previously handle missing data in the `predict` and `predict_proba` methods. In fact, handling missing data was the area in which they excelled. However, one couldn't calculate the probability of a sample containing missing values, fit a Bayesian network to incomplete data sets, or learn the structure of a network on incomplete data sets. The new missing value support allows all of these things (except Chow-Liu tree building on missing data sets)! To be clear, there is a very common iterative technique for fitting/learning models on incomplete data sets using an iterative EM based approach. This does not do that. This only ignores sufficient statistics from missing samples, and so is not an iterative approach.\n",
    "\n",
    "Learning the structure of a network on an incomplete data set should take a similar amount of time as learning it on a complete data set. If you are indicating missing values in numeric data sets, you will have to convert your data set to floats, whereas previously integers would be fine. If your data set is complete, there is no need."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "101 ms ± 4.45 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "129 ms ± 5.92 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
     ]
    }
   ],
   "source": [
    "X = numpy.random.randint(3, size=(500, 10)).astype('float64')\n",
    "\n",
    "idxs = numpy.random.choice(5000, replace=False, size=2000)\n",
    "i, j = idxs // 10, idxs % 10\n",
    "X_nan = X.copy()\n",
    "X_nan[i, j] = numpy.nan\n",
    "\n",
    "%timeit -n 100 BayesianNetwork.from_samples(X, algorithm='exact')\n",
    "%timeit -n 100 BayesianNetwork.from_samples(X_nan, algorithm='exact')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusions\n",
    "\n",
    "Missing value support has been added to pomegranate as of v0.9.0! A lot of care was taken to make the interface as simple to the end user while not compromising on speed. While multivariate Gaussian distributions, and the compositional models that are built on top of them, may be slower on incomplete data sets than on complete ones, everything else should take a similar amount of time!\n",
    "\n",
    "The implemented missing value support focuses on ignoring data that is missing. Another approach that works well is to use an EM based algorithm to impute the missing values based on the observed values and the model and fit to that complete data set. This works well in the framework of probabilistic modeling and is a natural addition to pomegranate that I hope to add in the coming year.\n",
    "\n",
    "As always, feedback and questions are always welcome!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
